2012-03-02 3 views
48

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

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

Я хочу, чтобы удалить все строки, за исключением тех, которые содержат либо строку «текст» и или строку «л», так что мой выходной файл выглядит следующим образом:

some text here 
blah blah 123 
some other text as well 

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

+3

Must ответ использовать sed? grep сделает это очень легко. – Tim

ответ

11

Вы хотите напечатать только те строки, которые соответствуют либо «текст», либо «бла» (или оба), где различие между «и» и «или» имеет решающее значение.

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

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

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

sed -r -n -e '/text|blah/p' your_data_file 
+3

Если sed не поддерживает '-r', он, вероятно, не будет поддерживать' {} '. Это должно работать с более старыми seds: 'sed '/ text \ | blah /! D' file' –

+0

' {...} 'группировка команд была в 7-й версии UNIX-версии' sed'; Я не могу представить, как вы столкнулись с версией, где это не было подтверждено. –

79

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

sed '/text\|blah/!d' file 
some text here 
blah blah 123 
some other text as well 
+0

Спасибо, что работает. – user1246172

+1

Как я могу указать, например, что текст или бла может появляться только в последнем столбце? – discipulus

+2

@lovedynasty Если вы имеете в виду * в конце строки *, вы должны использовать '$': ''/ text $ \ | blah $ /! D'' – Melebius

5

Вы могли бы просто сделать это с помощью AWK,

$ awk '/blah|text/' file 
some text here 
blah blah 123 
some other text as well 
Смежные вопросы