A maneira simples mas ineficiente é processar o arquivo várias vezes, uma vez para cada palavra de entrada:
$ while read w; do sed -i "s/$w//ig" file2 ; done < file1
$ cat file2
Both the and are monarchs. Will the live? , it is!
Isso pode ser muito lento para arquivos grandes (e também corresponde a substrings). Você poderia fazer isso em uma única passagem com o Perl:
perl -lpe 'BEGIN{open(A,"file1"); chomp(@k = <A>)}
for $w (@k){s/\b\Q$w\E\b//ig}' file2
O \b
certifica-se de que apenas correspondemos aos limites das palavras, \Q\E
certifica-se de que $w
é considerado literalmente. Isso impedirá que o script corresponda a hiking
, mas ainda corresponderá a high-king
. Para evitar isso, você precisa listar explicitamente os caracteres que definem uma palavra:
perl -Mopen=locale -Mutf8 -lpe '
BEGIN{open(A,"file1"); chomp(@k = <A>)}
for $w (@k){s/(^|[ ,.—_;-])\Q$w\E([ ,.—_;-]|$)/$1$2/ig}' file2
Esse —
de caracteres não-ASCII acima precisa ser inserido na codificação UTF-8, pois estamos informando que perl
o código está escrito em UTF-8 com -Mutf8
. Estamos usando -Mopen=locale
para o conteúdo dos arquivos e stdout para ser decodificado / codificado no conjunto de caracteres do locale.