Происходит то, что файл конфигурации 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}
Для вашего фактического использования я рекомендую ответ Тердона с использованием Perl .
Однако простая версия без обработки слов, которые являются подстроками других слов (например, удаление слова «король» из «пеший туризм»), заключается в использовании одной команды Sed для генерации команды, выполняемой другим экземпляром Sed в вашем фактическом файле.
В этом случае с файлом слов
, содержащим «король» и «королева», и текстовым файлом
, содержащим ваш текст:
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
понимается буквально. Это остановит скрипт от сопоставления пешего туризма
, но он все равно будет соответствовать 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
для декодирования / кодирования содержимого файлов и стандартного вывода в наборе символов локали.
сохраните этот скрипт в файл 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
и один раз ФАЙЛ
для замены