假设我有很多
形式的文件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
答案 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