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

Происходит то, что файл конфигурации VAR_A перезаписывает содержимое VAR_A поступает из .bashrc .

Следовательно, решение напрашивается само собой: перед тем, как исходить из файла конфигурации, сохраните содержимое VAR_A , как показано ниже.

VAR_A_sav=${VAR_A} # assuming that VAR_A_sav does NOT exist in configuration

. ../configuration # that is, you must choose a name not existing in config.

VAR_A=${VAR_A_sav}
6
10.11.2016, 14:45
3 ответа

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

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

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

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

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

6
27.01.2020, 20:26

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

$ 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 понимается буквально. Это остановит скрипт от сопоставления пешего туризма , но он все равно будет соответствовать 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 

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

3
27.01.2020, 20:26

сохраните этот скрипт в файл 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

Я читаю СПИСОК СЛОВА и меняю его на регулярное выражение, например, я меняю вашу королеву и король и test в этом формате:

queen\|king\|test

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

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

с помощью этого сценария bash мы читаем один раз LISTWORD и один раз ФАЙЛ для замены

0
27.01.2020, 20:26

Теги

Похожие вопросы