gpt4 book ai didi

android - Bash sed 命令删除 Android 参数中匹配的所有行

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:58 32 4
gpt4 key购买 nike

我坚持使用 sed 命令删除文件中的所有匹配项和匹配项的参数。我尝试了许多不同的组合,但我无法完全获得满足我需要的命令。

这是我的 sed 命令:

sed -i '/test {/,/}/d' $FILE

这是我要删除的比赛:

  test {
library proxy
uuid 9d4921da-8225-4f29-aefa-6e6f69726861

libsw {
library test_sw
uuid 6ab06da4-c516-4611-8166-6168726e6f69
}

libhw {
library test_hw
uuid a0c30891-8246-4aef-b8ad-696f6e726861
}
}

不幸的是,我的命令导致上面的行没有被删除:

     libhw {
library test_hw
uuid a0c30891-8246-4aef-b8ad-696f6e726861
}
}

我的命令有效并删除了以下的整个匹配项/参数:

  test {
library test
uuid f1c02420-777f-11e3-981f-0800200c9a66
}

我将非常感谢能够深入了解我做错了什么,并可能修复以帮助我解决这个问题。

最佳答案

使用 GNU sed

sed -z 's/test {[^{}]*\({[^}]*}[^{}]*\)*}//g' testfile

-z 告诉 sed 读入文件中的所有字符,直到第一个 NUL 字符。由于没有合理的源/文本文件具有 NUL 字符,这与读取整个文件相同。

替换命令删除您要删除的文本。更详细:

  • test {[^{}]* 匹配后跟任意数量的非大括号字符的 test { 字符串。

  • \({[^}]*}[^{}]*\)* 匹配任意数量的组,\(...\),由一个左花括号 {、任意数量的非花括号 [^}]* 和一个右花括号 组成>},后跟任意数量的非花括号,[^{}]*

  • } 匹配与 test { 中的左大括号相对应的右大括号。

使用其他sed

如果我们使用的 sed 不支持 -z 标志,那么我们需要添加命令以一次读取多行。例如:

sed  'H;1h;$!d;x; s/test {[^{}]*\({[^}]*}[^{}]*\)*}//g' testfile

同时删除包含最后一行的行

此变体将 (a) 删除 text { 之前的所有空格,并且 (b) 删除结束 } 之后的所有空格以及换行符紧随其后:

sed  'H;1h;$!d;x; s/[[:blank:]]*test {[^{}]*\({[^}]*}[^{}]*\)*}[[:blank:]]*\n//g' file

使用 awk

awk '/test {/{f=1; n=0} !f{print} {n+=gsub(/{/,"{", $0)-gsub(/}/,"}",$0)} n==0{f=0}' testfile

在这里,变量 f 跟踪我们何时处于 test block 中。变量 n 跟踪有多少个打开的 { 。一旦我们进入一个 test block ,它就会停止打印,直到最后一个打开的 { 被关闭。

  • /test {/{f=1; n=0}

    当我们到达包含字符 test { 的行时,我们将 f 设置为 1,并将 n 设置为零。

  • !f{print}

    如果 f 为零,我们将打印该行。

  • n+=gsub(/{/,"{", $0) - gsub(/}/,"}",$0)

    这会更新打开 { 的计数。 gsub(/{/,"{", $0) 返回 { 的数量,而 gsub(/}/,"}",$0) 返回 的数量。我们减去这两个数字以获得左大括号的净变化。

  • n==0 {f=0}

    当左括号计数下降到零时,我们将 f 设置为零以指示 test { 组完成。

关于android - Bash sed 命令删除 Android 参数中匹配的所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38217727/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com