Команда Sed: как заменить, если существует else, просто вставить?
Мне нужно отредактировать несколько строк в файле, чтобы
если строка начинается с (av или avpgw), то замените их новым текстом,
иначе просто вставьте новый текст в начало.
Как я могу сделать это с помощью sed?
Ответ 1
Вы можете сделать это следующим образом:
sed -e 's/^avpgw/new text/' -e t -e 's/^av/new text/' -e t -e 's/^/new text/' file
Это заменяет шаблон new text (s///) и переходит к концу (t). В противном случае он пробует следующий шаблон. См. Также сводные команды sed.
Вы также можете отделить команды с помощью ;:
sed 's/^avpgw/new text/; t; s/^av/new text/; t; s/^/new text/' file
или поместите команды в файл команды sed:
s/^avpgw/new text/
t
s/^av/new text/
t
s/^/new text/
и назовите его следующим образом:
sed -f commandfile file
Если вы хотите проигнорировать регистр, добавьте я в конце подстановочной команды, как в s/^av/new text/i. Другой способ - записать его с наборами символов s/^[aA][vV]/new text/. Но это не соответствует sed, для этого вы можете искать регулярные выражения в целом.
Ответ 2
Это может сработать для вас (GNU sed):
sed -r 's/^av(pgw)?.*/replacement/;t;s/^/replacement /' file