Как заставить sed удалить строки, не соответствующие подстановке - PullRequest
23 голосов
/ 22 ноября 2011

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

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

без необходимости писать выражение дважды:

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

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

Ответы [ 4 ]

25 голосов
/ 24 ноября 2011

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

$ 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
17 голосов
/ 22 ноября 2011

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

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

или

sed 's/<expression>/<replacement>/gp;d' file
4 голосов
/ 22 ноября 2011
cat file | sed -n '/<expression>/{s//<replacement>/g;p;}'
0 голосов
/ 22 ноября 2011

Как насчет:

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

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

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

...