我需要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'
...但这只会删除包含&#34;而不是&#34;的行。部分,并显示其他行。我喜欢的是,如果&#34;不是 - 这个&#34;在&#34;这个&#34;。
的一行或两行内找到有没有办法实现这个目标?
P.S。我使用的是Ubuntu和gnome-terminal。
答案 0 :(得分:2)
听起来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