Подтвердить что ты не робот

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

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

4b9b3361

Ответ 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