Assumindo que file1 e file2 estão classificados (caso contrário, join não funcionará):
diff -u file1 file2 |
grep -E "^[+-]($(echo $(join -o0 file1 file2) | tr ' ' '|'))"
Explicação:
O comando join gerará o campo de junção que ocorre nos dois arquivos (ou seja, a primeira palavra da linha que é a mesma nos dois arquivos), um em cada linha. Nós echo this embora tr , substituindo todos os espaços por um pipe ( | ). O motivo para fazer o echo ligeiramente complicado (e não apenas direcionar o resultado de join diretamente por tr ) é que a saída de join terá uma nova linha no final dela, o que fazemos não quer substituir por um pipe.
Para os arquivos de exemplo ( aqueles que foram originalmente fornecidos pelo OP antes da edição da pergunta ), a join , echo , tr thingy produzirá bar|foo . Isso é usado como parte de uma expressão regular estendida em grep -E para filtrar a saída de diff -u .
A saída da linha de comando é:
-bar c d
+bar x y