我需要在文件中搜索字符串,删除包含该字符串的任何行,并删除包含该字符串的任何行后面的两行。我希望我可以用这样的东西来完成这个…
$ 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/
,则读取接下来的两行,否则打印您所在的行。