在grep中抑制匹配本身

时间:2011-03-02 08:52:54

标签: regex grep

假设我有很多

形式的文件
First Line Name
Second Line Surname Adress
Third Line etc
etc

现在我使用grep来匹配第一行。但我这样做实际上是为了找到第二行。第二行不是可以匹配的模式(它只取决于第一行)。我的正则表达式模式工作,我正在使用的命令是

grep -rHIin pattern . -A 1 -m 1

现在-A选项会在匹配后打印。 {1}}选项在1场比赛后停止(因为还有其他一行符合我的模式,但我对第一场比赛感兴趣,无论如何......)

这实际上有效,但输出是这样的:

-m

我已经阅读了手册,但无法提供任何线索或有关该信息的信息。现在问题就在这里。

如何取消匹配本身?输出应采用以下形式:

./example_file:1:        First Line Name
./example_file-2-        Second Line Surname Adress

4 个答案:

答案 0 :(得分:2)

sed救援:

sed -n '2,${p;n;}'

此处的特定sed命令从其输入的第2行开始,并打印每隔一行。将grep的输出传递给它,你只能从grep输出中得到偶数行。

sed命令本身的解释:

2,$ - 从第2行到文件最后一行的行范围

{p;n;} - p rint当前行,然后ig n下一行(然后再重复)

(在所有偶数行的特殊情况下,另一种写作方式是sed -n 'n;p;'因为我们实际上不需要特殊情况下任何前导行。如果你想跳过前5行对于该文件,这是不可能的,您必须使用6,$语法。)

答案 1 :(得分:1)

您可以使用sed在每场比赛后打印一行:

sed -n '/<pattern>/{n;p}' <file>

要获得递归和文件名,您需要以下内容:

find . -type f -exec sed -n '/<pattern>/{n;s/^/{}:/;p}' \;

答案 2 :(得分:0)

如果您已经阅读过关于grep的书籍,那么您还可以阅读另一个常见的Unix工具 awk 手册。

在awk中,您的任务将通过一个简单的代码解决。 (至于我,当我想使用手册时,我总是要通过手册(info awk)来刷新我对awk语法的了解。)

或者,您可以提出一个结合find(迭代文件)和grep(选择行)和head / tail的解决方案(为每个单独的文件丢弃您不想要的行。 find的复杂性是能够单独处理每个文件,丢弃每个文件的行。

答案 3 :(得分:-1)

您可以通过grep -v pattern

来管道搜索结果