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

Как сделать sed удалить строки, не соответствующие замене

Я в основном хочу это сделать:

cat file | grep '<expression>' | sed 's/<expression>/<replacement>/g'

не записывая выражение дважды:

cat file | sed 's/<expression>/<replacement>/g'

Есть ли способ сказать sed не печатать строки, которые не соответствуют регулярному выражению в команде substitute?

4b9b3361

Ответ 1

Скажем, у вас есть файл, содержащий текст, который вы хотите заменить.

$ cat new.text 
A
B

Если вы хотите изменить A на a, тогда в идеале мы сделаем следующее -

$ sed 's/A/a/' new.text 
a
B

Но если вы не хотите получать строки, которые не влияют на подстановку, вы можете использовать комбинацию n и p, как показано ниже -

$ sed -n 's/A/a/p' new.text 
a

Ответ 2

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

sed '/<expression>/!d;s//<replacement>/g' file

или

sed 's/<expression>/<replacement>/gp;d' file

Ответ 3

cat file | sed -n '/<expression>/{s//<replacement>/g;p;}'

Ответ 4

Как насчет:

cat file | sed 'd/<expression>/'

Удалит совпадающие шаблоны с входа. Конечно, это противоположно тому, что вы хотите, но, может быть, вы можете сделать противоположное регулярное выражение?

Пожалуйста, не то, что я не совсем уверен в синтаксисе, но использовал его пару раз некоторое время назад.