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.