具有正负滤波的多行grep

时间:2014-04-01 00:05:29

标签: bash ubuntu grep gnome-terminal

我需要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。

1 个答案:

答案 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