Eu estou tentando entender o comando linux diff em dois arquivos cujas linhas são apenas permutação uma da outra, mas não são capazes de grok a saída que ele gera. Considere os três comandos abaixo:
[myPrompt]$ cat file1
apples
oranges
[myPrompt]$ cat file2
oranges
apples
[myPrompt]$ diff file1 file2
1d0
< apples
2a2
> apples
Alguém pode explicar a saída enigmática acima do diff.
- Por que não há menção a "laranjas" na saída?
- O que significa
1d0
e2a2
significa?
Entendo a partir desta resposta que:
"<" significa que a linha está ausente no arquivo2 e ">" significa que a linha está ausente no arquivo1
MAS isso não explica por que faltam laranjas na saída.
oranges
é a maior parte comum entre os dois arquivos, o que você obtém é a maneira mais curta de expressar as diferenças entre os dois.diff -u file1 file2
. Isso é chamado de formato "diff unificado". O formato do diff original foi criado para ser muito compacto, mas os diffs unificados devem ser muito mais legíveis.diff -y file1 file2
Respostas:
Para entender o relatório, lembre-se de que
diff
é prescritivo, descrevendo quais alterações precisam ser feitas no primeiro arquivo (file1
) para torná-lo igual ao segundo arquivo (file2
).Especificamente, os
d
em1d0
meio eliminar eoa
de2a2
meios adicionar .Portanto:
1d0
significa que a linha 1 deve ser excluída emfile1
(apples
).0
na1d0
linha 0 significa que eles teriam aparecido no segundo arquivo (file2
) se não tivessem sido excluídos. Isso significa que, ao mudarfile2
parafile1
(para trás), acrescente a linha 1 dafile1
linha 0 apósfile2
.2a2
significa acrescentar a segunda linha (oranges
) dafile2
agora segunda linha defile1
(após excluir a primeira linhafile1
,oranges
alternada para a linha 1)fonte
0
dentro1d0
?Considere estes arquivos:
file1
:file2
:Como
diff
funciona, dado que é baseado em pedidos:diff
lê o primeiro bloco de linhas defile1
efile2
, e tenta encontrar linhas iguais:Agora ele pulará todas as linhas iguais nos dois arquivos, o que é exatamente
oranges
o caso:Agora encontre outro conjunto de linhas semelhantes e imprima diferenças:
Ignore as linhas semelhantes
Encontre linhas idênticas, se possível, e imprima diferenças:
Agora, se eu fizer
diff file1 file2
:Agora é simples explicar o que
diff
significa saída:Para fazer
file1
igual afile2
:1,2d0
: Eliminar (d
) linhas1-2
defile1
e modificar linha0
defile2
conformidade3a2
: Anexar (a
) à linha3
dafile1
linha2
defile2
4a4,5
: Anexar à linha4
defile1
linhas4-5
defile2
diff
comparafile1
comfile2
linha por linha e resolve diferenças na memória temporária. Depois defile1
igualarfile2
até a primeira ocorrência de uma linhafile1
, o que também ocorrefile2
, todas as linhas iguais até uma diferença não são mencionadas, geralmente indicadas como---
. Nesse caso, há apenas uma linha semelhante, que éoranges
. Note que eu dissefile1
igual afile2
, entãofile1
é visualizado em relaçãofile2
e não o contrário.A saída é em relação ao primeiro arquivo fornecido, neste caso
file1
.fonte
apples
ocorre nos dois arquivos também.oranges
". Errado: Na verdade, existem duas linhas, que não são apenas semelhantes , mas absolutamente idênticas . Um deles lêoranges
, o outro lêapples
. Além disso, sua explicação (puramente baseada em ordem) está em contradição com o comentário de Stéphane sobre a questão (baseada em comprimento) - quem está correto?Ali estão eles:
fonte
O formato de saída padrão (antigo) exibirá a diferença entre os arquivos sem o texto ao redor das áreas em que os arquivos diferem.
Por exemplo:
1d0 <
(excluir) significa que as maçãs precisam ser removidas da 1ª linha defile1
e2a2 >
(anexar) significa que as maçãs precisam ser adicionadasfile2
na 2ª linha, para que os dois arquivos possam ser correspondidos.A documentação disponível em
info diff
explica ainda mais:Veja também:
Então, para ver as laranjas, você teria que diferenciá-las lado a lado ou usando o contexto unificado.
No exemplo:
fonte