Я склонен использовать awk
для более сложных задач, он немного мощнее, чем sed
, с правильными конструкциями циклов и выбора (расширен для удобства чтения, вы можете сжать его обратно до одной строки, если хотите):
pax$ echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice' | awk '
/1 is/ {if (f) {print} else {f = 1}}
!/1 is/ {print}'
xyz
line 2 is ugly
myline 111 is nice
Для любой строки не , соответствующей шаблону (!/1 is/
), он просто печатает ее.
Для строк, которые do соответствуют шаблону, он печатает их все, если установлен флаг f
(изначально он не установлен). Когда флаги не установлены, и он сталкивается с соответствующей строкой, он устанавливает флаг и не печатает его. Это в основном удаляет первую совпадающую строку по желанию.
Если вы хотите изменить первую подходящую строку, а не удалять ее, вы просто вставляете код рядом с f = 1
, чтобы сделать это, что-то вроде:
pax$ echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice' | awk '
/1 is/ {if (f) {print} else {f = 1;print "URK!!!"}}
!/1 is/ {print}'
xyz
URK!!!
line 2 is ugly
myline 111 is nice
Чтобы использовать переменную оболочки в awk
, вы можете использовать опцию -v
, чтобы передать ее как действительную переменную awk
:
pax$ export xyzvar=URK ; echo '
xyz
myline 1 is pretty
line 2 is ugly
myline 111 is nice' | awk -vmyvar=$xyzvar '
/1 is/ {if (f) {print} else {f = 1;print myvar}}
!/1 is/ {print}'
xyz
URK
line 2 is ugly
myline 111 is nice