我需要对不包含一个字符串但包含其他字符串的多行字符串进行 grep。这是我在一些 HTML 文件中搜索的内容:
<not-this>
<this> . . . </this>
</not-this>
换句话说,我想查找包含
<this>
的文件。和 </this>
在同一行,但不应被 html 标签包围 <not-this>
在之前和/或之后的行上。这是我想做的一些速记逻辑:grep 'this' && '/this' && !('not-this')
我已经看到以下答案...
grep -Er -C 2 '.*this.*this.*' . | grep -Ev 'not-this'
...但这只会删除包含“非”部分的行,并显示其他行。我想要的是,如果在“this”的一两行中找到“not-this”,它根本不会提取这些结果。
有没有办法做到这一点?
附言我正在使用 Ubuntu 和 gnome 终端。
最佳答案
听起来像 awk
脚本在这里可能会更好:
$ cat input.txt
<not-this>
<this>BAD! DO NOT PRINT!</this>
</not-this>
<yes-this>
<this>YES! PRINT ME!</this>
</yes-this>
$ cat not-this.awk
BEGIN {
notThis=0
}
/<not-this>/ {notThis=1}
/<\/not-this>/ {notThis=0}
/<this>.*<\/this>/ {if (notThis==0) print}
$ awk -f not-this.awk input.txt
<this>YES! PRINT ME!</this>
或者,如果您愿意,可以挤压
awk
将脚本写成一行:$ awk 'BEGIN {notThis=0} /<not-this>/ {notThis=1} /<\/not-this>/ {notThis=0} /<this>.*<\/this>/ {if (notThis==0) print}' input.txt
关于bash - 带正负过滤的多行 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22774478/