sed удаляет строки, не содержащие конкретной строки - PullRequest
58 голосов
/ 03 марта 2012

Я новичок в sed и у меня следующий вопрос. В этом примере:

some text here
blah blah 123
another new line
some other text as well
another line

Я хочу удалить все строки, кроме тех, которые содержат либо строку 'text' и , либо строку 'blah', поэтому мой выходной файл выглядит так:

some text here
blah blah 123
some other text as well

Любые подсказки, как это можно сделать с помощью sed?

Ответы [ 3 ]

95 голосов
/ 03 марта 2012

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

sed '/text\|blah/!d' file
some text here
blah blah 123
some other text as well
16 голосов
/ 03 марта 2012

Вы хотите напечатать только те строки, которые соответствуют 'text' или 'blah' (или обоим), где различие между 'и' и 'or' довольно важно.

sed -n -e '/text/{p;n;}' -e '/blah/{p;n;}' your_data_file

-n означает, что не печатать по умолчанию. Первый шаблон ищет «текст», печатает его, если соответствует, и переходит к следующей строке; второй шаблон делает то же самое для «бла». Если бы «n» там не было, то строка, содержащая «text and blah», была бы напечатана дважды. Хотя я мог бы использовать только -e '/blah/p', симметрия лучше, особенно если вам нужно расширить список совпадающих слов.

Если ваша версия sed поддерживает расширенные регулярные выражения (например, GNU sed поддерживает -r), то вы можете упростить это до:

sed -r -n -e '/text|blah/p' your_data_file
5 голосов
/ 27 сентября 2014

Вы можете просто сделать это через awk,

$ awk '/blah|text/' file
some text here
blah blah 123
some other text as well
...