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

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

Пример:

Файл 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 для замены

  • Регулярные команды и команды с командой sed
  • Извлечение URL из неформатированного текста
  • Печать регулярного выражения Sed в файл .txt
  • Многострочная обработка текста: редактирование sshd_config
  • Curl url txt file, но grep каждый URL отдельно от одного файла
  • Есть ли простой способ сделать эквивалент `sed ...` заменяя одну и ту же строку несколькими значениями?
  • добавьте «#» в начале выбранных строк в файле
  • Найти и заменить слова в текстовом файле рекурсивно
  • замените с начала строки на 1 из нескольких шаблонов в конец другой строки со вторым шаблоном
  • Как свернуть 'grep -c <токен> * .h * .cpp' в один счет?
  • сценарий оболочки для извлечения символов
  • Interesting Posts

    Выведите результат команды DF в переменную, затем распечатайте на HTML-страницу

    Почему возникает ошибка при двойном цитировании одинарных кавычек в скрипте, который запускает удаленную команду SSH?

    / root / bin / ffmpeg: ошибка при загрузке разделяемых библиотек: libtheoraenc.so.1: невозможно открыть файл общих объектов: нет такого файла или каталога

    скрипт для проверки запущенных служб на определенных портах

    Загрузка общих объектов относительно исполняемого пути

    debian apt-get dist-upgrade от сжатия до свистящего сбоя на vlc

    Является ли это против linux ethos для обеспечения индикатора прогресса для выполнения команд?

    Когда я нахожусь в VirtualEnv и делаю apt-get install, есть ли разница?

    Отсутствует служебный файл для pure-ftpd

    PulseAudio не может изменить приемник для одной конкретной программы

    Понимание кодов пробуждения ACPI / DSDT (таблица характеристик дифференцированной системы) BIOS Thinkpad T430s

    Как обернуть команды bash после добавления цвета

    Извлечь слова вместо букв из pdf-файлов?

    Cmus не показывает песни после новой установки

    Использование sed из оболочки андроида

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