Как я могу заставить 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