Как я могу заставить sed выйти после первого соответствующего диапазона адресов?

У меня есть файл:

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

Я хочу, чтобы sed совпадал только между двумя вхождениями триггера. Поэтому я попробовал:

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

Но, как говорит справочная страница sed, которая соответствует всем вхождениям в двух строках с помощью "триггера". Я хочу, чтобы sed завершил работу после первого совпадения, поэтому выход будет выглядеть следующим образом:

trigger
text1
text2
trigger

Как это сделать?

Ответы

Ответ 1

Вы можете сделать это с помощью цикла в GNU sed:

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

Пояснение:

  • Когда вы видите первый /trigger/, запустите блок команд
  • p - распечатать строку
  • :loop - установите метку с именем loop
  • n - введите следующую строку
  • p - распечатать строку
  • /trigger/q - если строка соответствует /trigger/, то выйдите из sed
  • перейти к loop

Ответ 2

В то время как Jason ans - это то, что вы ищете, я бы предпочел использовать awk для этой задачи

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

Вывод:

trigger
text1
text2
trigger

Это обеспечило бы большую гибкость выбора строк между n th и m появлением trigger.

например.

$ awk -v n=2 -v m=3 '/trigger/{p++} p==m{print; exit} p>=n' file
trigger
text5
trigger

Ответ 3

Другое отклонение awk:

awk '/trigger/{f++} f; f>1 {exit}' file