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



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

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

…但不幸的是,这并没有奏效。是否有一个简单的我可以用grep或其他shell命令来做到这一点?

下面的操作在GNU sed和OS x上都有效。

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

您可以对awk执行此操作,如下所示:

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

它基本上启动一个行计数,每当它在一行上找到two字符串时就扔掉(3)。然后将这些行丢弃,直到跳过计数器为零。

使用GNU sed:

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

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

下面是使用Perl的一种方法:

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

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

然而,问题是,如果第三行或第四行匹配/two/,那么您仍然会得到相同的输出。@paxdiablo的解决方案更为完整。但我更喜欢Q& d

最新更新