Я пытаюсь использовать sed чтобы добавить строку после определенного шаблона, но я хочу исключить случай, когда дополнительная строка уже присутствует.

Например:

"text.txt"

Hello
Bar
Hello world!

Если я использую sed -i -e 's/Hello/Hello world!' text.txt третья строка становится

Hello world! world!

но я хотел бы сохранить его нетронутым.

Я нашел этот связанный вопрос, но не все строки в моем файле должны быть изменены.

У кого-нибудь есть рецепт для этого?

2 ответа2

2

Вы можете использовать явные якоря начала и конца строки (^ и $):

$ sed -e 's/^Hello$/Hello world!/' <<EOF
> Hello
> Bar
> Hello world!
> EOF
Hello world!
Bar
Hello world!

Это также может быть несколько улучшено для удобства чтения / краткости, используя \0 который заменяет все совпадение ... Таким образом, вам не нужно повторять Hello:

$ sed -e 's/^Hello$/\0 world!/' <<EOF
> Hello
> Bar
> Hello world!
> EOF
Hello world!
Bar
Hello world!
1

Ответ на ваш вопрос как бы скрыт в одном из ответов на соответствующий вопрос:

/Hello world!/ ! s/Hello/Hello world!/

Первая его часть - это "адрес", то есть следующая команда применяется только к соответствующим ей строкам. ! отменяет условие, то есть команда будет применяться только к строкам, не совпадающим с адресом. Итак, другими словами, замените Hello на Hello world!в строках, которые не содержат Hello world! ,

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .