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.