我有一个文件:
header
trigger
text1
text2
trigger
text5
trigger
...
trigger
...
我希望sed只匹配前两次'trigger'。所以我试过了:
sed -n '/trigger/,/trigger/p'
但是正如sed的手册页所说,它匹配两行中所有出现的'trigger'。我希望sed在第一场比赛后退出,所以输出将是:
trigger
text1
text2
trigger
我如何做到这一点?
答案 0 :(得分:27)
您可以使用GNU sed
中的循环执行此操作:
sed -n '/trigger/{p; :loop n; p; /trigger/q; b loop}'
说明:
/trigger/
时,启动一个命令块p
- 打印:loop
- 设置名为loop
n
- 获取下一行p
- 打印/trigger/q
- 如果该行与/trigger/
匹配,则退出sed
loop
答案 1 :(得分:2)
虽然jason的ans是你正在寻找的,但我更倾向于使用awk
来完成这项任务
awk '/trigger/{p++} p==2{print; exit} p>=1' file
输出:
trigger
text1
text2
trigger
这样可以更灵活地选择n
和m
trigger
之间的行。
E.g。
$ awk -v n=2 -v m=3 '/trigger/{p++} p==m{print; exit} p>=n' file
trigger
text5
trigger
答案 2 :(得分:0)
另一个awk
变体:
awk '/trigger/{f++} f; f>1 {exit}' file