10

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

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

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

4

4 回答 4

7

以下适用于 GNU sed 和 OS X。

$ sed '/two/{N;N;d;}' temp.txt
one
five
  • 查找行匹配two
  • 再读两行
  • 删除它们
于 2013-04-17T01:54:02.893 回答
3

使用 GNU sed:

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

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

于 2013-04-17T01:55:45.323 回答
3

您可以使用 执行此操作awk,根据以下记录:

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

one
five

two每当它在一行上找到字符串时,它基本上都会启动一个行计数器来丢弃(3) 。然后它会丢弃这些行,直到跳过计数器达到零。打印任何未标记为跳过的行。

于 2013-04-17T01:56:42.667 回答
1

这是使用 Perl 的一种方法:

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

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

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

于 2013-04-17T02:59:24.123 回答