在grep中组合-v标志和-A标志

时间:2013-04-17 01:49:22

标签: unix sed grep

我需要在文件中搜索字符串,删除包含该字符串的任何行,并删除包含该字符串的任何行后面的两行。我希望我能用这样的东西来完成这个......

$ grep -v -A 2 two temp.txt
one
five
$

......但不幸的是,这不起作用。有一个简单的我可以使用grep或其他shell命令吗?

4 个答案:

答案 0 :(得分:5)

以下适用于GNU sed和OS X.

$ sed '/two/{N;N;d;}' temp.txt
one
five
  • 找到与two
  • 匹配的行
  • 再读两行
  • 删除它们

答案 1 :(得分:3)

您可以使用awk执行此操作,具体如下:

pax> echo 'one
two
three
four
five' | awk '/two/ {skip=3} skip>0 {skip--;next} {print}'

one
five

它基本上会在一条线上找到two字符串时开始一条线的计数器扔掉(3)。然后抛出那些线,直到跳过计数器达到零。任何未标记为跳过的行都会被打印出来。

答案 2 :(得分:2)

使用GNU sed:

sed '/two/,+2d' temp.txt

这使用双地址语法(addr1,addr2)来匹配具有单词2(/two/)的行加上(+2)之后的两行。 d命令删除这些行。

答案 3 :(得分:1)

以下是Perl的一种方法:

$ perl -ne'if (/two/){$x=<>;$x=<>;}else{print}' temp.txt 
one
five

-n是输入的隐式循环。如果您匹配/two/,请阅读接下来的两行,否则请打印您所在的行。

但问题是,如果你有第三行或第四行匹配/两个/,那么你仍然会得到相同的输出。 @ paxdiablo的解决方案更加完整。但我的更多是Q&amp; D.