Как сделать sed удалить строки, не соответствующие замене
Я в основном хочу это сделать:
cat file | grep '<expression>' | sed 's/<expression>/<replacement>/g'
не записывая выражение дважды:
cat file | sed 's/<expression>/<replacement>/g'
Есть ли способ сказать sed не печатать строки, которые не соответствуют регулярному выражению в команде substitute?
Ответы
Ответ 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>/'
Удалит совпадающие шаблоны с входа. Конечно, это противоположно тому, что вы хотите, но, может быть, вы можете сделать противоположное регулярное выражение?
Пожалуйста, не то, что я не совсем уверен в синтаксисе, но использовал его пару раз некоторое время назад.