Как удалить все вхождения списка слов из текстового файла?

У меня есть файл, содержащий список слов. Я хочу удалить все вхождения всех слов в этом файле из большого текстового файла.

Пример:

Файл 1

queen king 

Пример текстового файла

 Both the king and queen are monarchs. Will the queen live? Queen, it is! 

Вот что я пробовал:

 sed -i 's/queen/ /g' page.txt sed -i 's/Queen/ /g' page.txt 

Вывод

 Both the and are monarchs. Will the live? , it is! 

Список слов у меня большой (более 50000 слов). Как это сделать, не указывая шаблон в командной строке?

3 Solutions collect form web for “Как удалить все вхождения списка слов из текстового файла?”

Для вашего фактического использования я рекомендую ответить terdon с помощью Perl .

Однако простая версия без обработки слов, которые являются подстроками других слов (например, удаление «король» из «походов»), заключается в использовании одной команды Sed для генерации команды, выполняемой другим экземпляром Sed в вашем фактическом файле.

В этом случае с текстовым textfile содержащим «king» и «queen» и textfile содержащий ваш текст:

 sed -e "$(sed 's:.*:s/&//ig:' wordfile)" textfile 

Обратите внимание, что флаг « i gnore case» является расширением GNU, а не стандартным.

Простым, но неэффективным способом является обработка файла несколько раз, один раз для каждого входного слова:

 $ while read w; do sed -i "s/$w//ig" file2 ; done < file1 $ cat file2 Both the and are monarchs. Will the live? , it is! 

Это может быть очень медленно для больших файлов (а также соответствует подстрокам). Вы можете сделать это за один проход с Perl:

 perl -lpe 'BEGIN{open(A,"file1"); chomp(@k = <A>)} for $w (@k){s/\b\Q$w\E\b//ig}' file2 

\b убедитесь, что мы только сопоставляем границы слов, \Q\E убедитесь, что $w взято буквально. Это остановит сценарий от соответствия hiking но он все равно будет соответствовать high-king . Чтобы этого избежать, вам необходимо явно указать символы, которые определяют слово:

 perl -Mopen=locale -Mutf8 -lpe ' BEGIN{open(A,"file1"); chomp(@k = <A>)} for $w (@k){s/(^|[ ,.—_;-])\Q$w\E([ ,.—_;-]|$)/$1$2/ig}' file2 

Это символ, -Mutf8 ASCII, должен быть введен в кодировку UTF-8, поскольку мы говорим, что код написан в UTF-8 с помощью -Mutf8 . Мы используем -Mopen=locale для содержимого файлов и stdout для декодирования / кодирования в наборе символов локали.

сохраните этот скрипт в файл d : ( ЗАГРУЗИТЬ ИЗ GITHUB GIST )

 #!/bin/bash LIST=${1:?"LIST word"} FILE=${2:?"FILE name not set"} L=$( sed -e ':a;N;$!ba;s_\n_\x00_g' ${LIST}|sed -e 's_\x00_ \\|_g' -e's_\(\\|\)*$__g') P='s_\('$L'\)__ig' O="sed -e '$P' ${FILE}" eval "${O}" 

затем запустите его:

 bash ./d LIST FILE 

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

 bash ./d LIST FILE | tee NewFILE 

ИЛИ

 bash ./d LIST FILE > NewFile 

я читаю LIST WORD и меняю его на regex foramt, например, я изменяю queen и king и test на этот формат:

 queen\|king\|test 

затем создайте команду sed с этим параметром:

 sed -e 's_\(queen\|king\|test\) *__ig' FILE 

с этим скриптом bash мы читаем один раз LISTWORD и однажды FILE для замены

  • Шаблон Regex для замены нескольких значений с помощью sed
  • Как удалить определенные ключи из списка слов?
  • Удалить строки из файла в зависимости от строк, найденных в другом файле
  • Как найти и заменить только определенное слово (которое находится в конце файла) с помощью команды оболочки?
  • Проблема с sed в массиве, содержащем строки, содержащие пробелы
  • сравнить файлы по строкам и создать новое одно bash-программирование
  • Найдите и замените строку, если определенный шаблон найден в строке
  • Искать текст в Linux, но не отображать полную строку в результатах
  • распечатать последнее поле из строки + альтернатива для awk
  • ksh / bash Форматирование файлов через sed по файлу cat | команда sed
  • Как анализировать файл данных для извлечения определенных данных и формата для другого использования?
  • Interesting Posts

    Добавление файлов в initrd делает Linux неспособным прочитать его

    Копировать / Вставить с клавиатурой в rxvt

    Arch Linux на проблемах с подключением виртуального интернет-соединения на VirtualBox

    Можете ли вы указать корпус для вырезания?

    Как найти файлы по сравнению со временем определенного файла

    Где получить библиотеки UUID и код

    Маршрутизация трафика для конкретного пользователя для конкретного интерфейса

    Какие репозитории мне нужны для установки heartbeat и haproxy на RHEL?

    Сценарий Bash для создания скрипта со встроенными значениями

    Как определить тип fs моего текущего рабочего каталога?

    Чашки с использованием сервера печати и локальных принтеров одновременно?

    Фиксирование сломанной инициализации X

    Есть ли способ кикнуть kswapd и заставить его обмениваться страницами?

    Почему Unix-подобные системы выполняют новый процесс при вызове новой функции?

    Список всех файлов / двоичных файлов в текущем PATH

    Linux и Unix - лучшая ОС в мире.