Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在grep中组合-v标志和-A标志_Unix_Sed_Grep - Fatal编程技术网

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
  • 再读两行
  • 删除它们
使用GNU时:

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。