Мне нужно заменить всю строку на 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