2013-06-11 5 views
3

У меня есть текстовый файл, и я хочу, чтобы удалить все строки, содержащие слова: facebook, youtube, google, amazon, dropbox и т.д.Удалить строку, содержащую одну из нескольких строк

Я знаю, чтобы удалить строки, содержащие строку с СЭД:

sed '/facebook/d' myfile.txt 

Я не хочу, чтобы запустить эту команду пять различных раз, хотя для каждой строки, есть способ объединить все строки в одной команде?

+1

Urgh так много высоко на Google вопросы, как это, где все ответы предполагают короткий список. Его список заканчивается и т. Д., Есть ли какой-либо ответ ниже разумного, если этот черный список составляет 100 000 слов? – OGHaza

ответ

5

Попробуйте это:

sed '/facebook\|youtube\|google\|amazon\|dropbox/d' myfile.txt 

От GNU's sed manual:

regexp1\|regexp2

Совпадает regexp1 или regexp2. Используйте круглые скобки для использования сложных альтернативных регулярных выражений. Процесс сопоставления ставит каждую альтернативу, в свою очередь, слева направо, а первую использует . Это расширение GNU.

6
grep -vf wordsToExcludeFile myfile.txt 

"wordsToExcludeFile" должен содержать слова, которые вы не хотите, по одному в каждой строке.

Если вам нужно сохранить результат обратно в тот же файл, а затем добавьте в команду:

> myfile.new && mv myfile.new myfile.txt 
+0

Это не работает с точками? (facebook.com, dropbox.com) – user1899415

+0

точка - это символ регулярного выражения «подстановочный знак»: точка соответствует любому символу. Регулярное выражение «facebook.com» будет соответствовать строке «facebook-com», но оно также будет соответствовать строке «facebook.com». Это долгий разговор, да, это сработает. Вы видели неожиданные результаты? –

+0

хороший ответ, спасибо – user1899415

4

С awk

awk '!/facebook|youtube|google|amazon|dropbox/' myfile.txt > filtered.txt 
Смежные вопросы