Unix 在grep中组合-v标志和-A标志
我需要在文件中搜索字符串,删除包含该字符串的任何一行,并删除包含该字符串的任何一行后面的两行。我希望我能用这样的东西来完成这件事Unix 在grep中组合-v标志和-A标志,unix,sed,grep,Unix,Sed,Grep,我需要在文件中搜索字符串,删除包含该字符串的任何一行,并删除包含该字符串的任何一行后面的两行。我希望我能用这样的东西来完成这件事 $ grep -v -A 2 two temp.txt one five $ …但不幸的是,这不起作用。有没有一个简单的方法可以用grep或其他shell命令来实现这一点?下面的方法既适用于GNU-sed,也适用于OS-X $sed'/two/{N;N;d;}'temp.txt 一 五 查找匹配的行two 再读两行 删除它们 使用GNU时: sed '/two/
$ grep -v -A 2 two temp.txt
one
five
$
…但不幸的是,这不起作用。有没有一个简单的方法可以用grep或其他shell命令来实现这一点?下面的方法既适用于GNU-sed,也适用于OS-X
$sed'/two/{N;N;d;}'temp.txt
一
五
- 查找匹配的行
two
- 再读两行
- 删除它们
sed '/two/,+2d' temp.txt
这使用了两个地址语法(
addr1,addr2
)来匹配带有单词2(/two/
)的行以及(+2
)后面的两行。d
命令删除这些行。您可以使用awk
执行此操作,如下所示:
pax> echo 'one
two
three
four
five' | awk '/two/ {skip=3} skip>0 {skip--;next} {print}'
one
five
当它在一行中找到
two
字符串时,它基本上会启动一个要丢弃的行计数器(3)。然后,它将这些行丢弃,直到跳过计数器达到零。任何未标记为跳过的行都将被打印。这里有一种使用Perl的方法:
$ perl -ne'if (/two/){$x=<>;$x=<>;}else{print}' temp.txt
one
five
$perl-ne'if(/two/){$x=;$x=;}else{print}temp.txt
一
五
-n
是输入上的隐式循环。如果您匹配/two/
,请阅读下两行,否则请打印您所在的行
然而,问题是,如果第三行或第四行匹配/two/,那么仍然会得到相同的输出@paxdiablo的解决方案更加完整。但我的问题更多。我能想到的唯一一件事是,可能他们使用的是一种更旧的、不使用GNU的、没有
+数字选项的产品。但既然它有效(而且我不喜欢由下层选民驾驶),我们就投票反对它。这样做的好处是处理12323445
→ <代码>一五正确。你的答案和@JohnKugelman的答案都很简洁,它们都在GNU/Linux上工作,都不在OS X上工作(对于这个特殊任务,对我来说没什么大不了的)。对于提供语法的简要解释,您可以得到公认的答案。谢谢。在d和后面加一个分号。加强大括号,它也应该适用于MacOS X。