Sed заменяет целую строку, когда найдено совпадение

Мне нужно заменить всю строку на sed, если она соответствует шаблону. Например, если строка "одна две шесть три четыре", а если "шесть", то вся строка должна быть заменена "ошибкой".

Ответ 1

Вы можете сделать это с помощью любого из них:

sed 's/.*six.*/fault/' file     # check all lines
sed '/six/s/.*/fault/' file     # matched lines -> then remove

Он получает полную строку, содержащую six и заменяет ее на fault.

Пример:

$ cat file
six
asdf
one two six
one isix
boo
$ sed 's/.*six.*/fault/'  file
fault
asdf
fault
fault
boo

Он основан на этом решении на Заменить всю строку, содержащую строку, используя Sed

В более общем плане вы можете использовать выражение sed '/match/s/.*/replacement/' file. Это будет выполнять выражение sed 's/match/replacement/' в тех строках, содержащих match. В вашем случае это будет:

sed '/six/s/.*/fault/' file

Что, если у нас будет "один два шесть восемь одиннадцать три четыре", и мы хотим включают "восемь" и "одиннадцать" в качестве наших "плохих" слов?

В этом случае мы можем использовать -e для нескольких условий:

sed -e 's/.*six.*/fault/' -e 's/.*eight.*/fault/' file

и т.д.

Или также:

sed '/eight/s/.*/XXXXX/; /eleven/s/.*/XXXX/' file

Ответ 2

Это может сработать для вас (GNU sed):

sed -e '/six/{c\fault' -e ';d}' file

или

sed '/six/{c\fault'$'\n'';d}' file

Ответ 3

Выше ответы работали отлично для меня, просто упомянув альтернативный способ

Сопоставьте один шаблон и замените его на новый:

sed -i '/six/c fault' file

Совместите несколько шаблонов и замените их на новую (команды конкатенации):

sed -i -e '/one/c fault' -e '/six/c fault' file