在第一个匹配的地址范围后,如何让sed退出?

时间:2014-01-06 04:31:08

标签: regex sed

我有一个文件:

header
trigger
text1
text2
trigger
text5
trigger
...
trigger
...

我希望sed只匹配前两次'trigger'。所以我试过了:

sed -n '/trigger/,/trigger/p'

但是正如sed的手册页所说,它匹配两行中所有出现的'trigger'。我希望sed在第一场比赛后退出,所以输出将是:

trigger
text1
text2
trigger

我如何做到这一点?

3 个答案:

答案 0 :(得分:27)

您可以使用GNU sed中的循环执行此操作:

sed -n '/trigger/{p; :loop n; p; /trigger/q; b loop}'

说明:

  1. 当您看到第一个/trigger/时,启动一个命令块
  2. p - 打印
  3. :loop - 设置名为loop
  4. 的标签
  5. n - 获取下一行
  6. p - 打印
  7. /trigger/q - 如果该行与/trigger/匹配,则退出sed
  8. 跳转到loop

答案 1 :(得分:2)

虽然jason的ans是你正在寻找的,但我更倾向于使用awk来完成这项任务

awk '/trigger/{p++} p==2{print; exit} p>=1' file

输出:

trigger
text1
text2
trigger

这样可以更灵活地选择nm 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