Esta linha de comando deve fazer o truque:
while read -r word; do sed -e "s/\<$word\>//g" -e '/^\s*$/d' file2 -i; done < file1
Após a execução do comando acima, o arquivo de saída - file2 - deve ficar assim:
This
is
my
word
file
Versão mais legível da linha de comando acima:
while read -r word; do \
sed -e "s/\<$word\>//g" -e '/^\s*$/d' file2 -i; \
done < file1
O loop while lê o arquivo linha por linha - < file1 . O valor de cada linha é usado como um valor da variável criada temporária, chamada $word - -r word . Essa variável é usada como um argumento no comando sed e é substituída por [ s ] por um valor em branco em file2 , a primeira expressão: "s/\<$word\>//g" = s/<source_value>/<replacement_value>/g . A g flag significa - aplica a substituição a todas as correspondências. Então, se houver uma linha em branco no arquivo, ela será removida - a segunda expressão: '/^\s*$/d' .
Precisamos usar a sintaxe \<...\> para encontrar apenas as correspondências exatas. Precisamos de aspas duplas - "..." - para a primeira expressão porque $word é o nome da variável e queremos expandi-la como seu valor dentro do comando sed .
A opção -i significa que as alterações serão feitas em seus lugares dentro do arquivo de destino - file2 . Se esta opção for removida, o resultado será lançado para stdout, mas não será significativo. A opção -i.bak não é aplicável a este cenário, porque o arquivo de destino será sobrescrito várias vezes, portanto, você deve criar uma cópia de backup antecipadamente.