Compreensão do resultado do diff

57

Eu tenho file1.txt

this is the original text  
line2  
line3  
line4  
happy hacking !  

e file2.txt

this is the original text  
line2  
line4  
happy hacking !  
GNU is not UNIX  

se eu fizer: diff file1.txt file2.txt recebo:

3d2  
< line3  
5a5  
> GNU is not UNIX  

Como a saída é geralmente interpretada? Acho que < significa removido, mas o que significa 3d2 ou 5a5 ?

Se eu fizer:

$ diff -u file1.txt file2.txt  
--- file1.txt        2013-07-06 17:44:59.180000000 +0200  
+++ file2.txt        2013-07-06 17:39:53.433000000 +0200  
@@ -1,5 +1,5 @@  
 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Os resultados são mais claros, mas o que significa @@ -1,5 +1,5 @@ ?

    
por Jim 06.07.2013 / 17:47

5 respostas

76

Na sua primeira diff output (assim chamada "normall diff"), o significado é o seguinte

< - denota linhas no arquivo1.txt

> - denota linhas no arquivo2.txt

3d2 e 5a5 indicam os números de linha afetados e quais ações foram executadas. d significa exclusão, a significa adicionar (e c significa alteração). o número à esquerda do caractere é o número da linha no arquivo1.txt, o número à direita é o número da linha no arquivo2.txt. Portanto, 3d2 informa que a terceira linha no arquivo1.txt foi excluída e tem o número de linha 2 no arquivo2.txt (ou melhor, que após a exclusão, o contador de linha retornou para o número de linha 2). 5a5 informa que começamos a partir da linha número 5 no arquivo1.txt (que estava realmente vazio depois de excluirmos uma linha na ação anterior), adicionamos a linha e essa linha adicionada é o número 5 no arquivo2.txt.

A saída do comando diff -u é formatada de forma um pouco diferente (o chamado formato "diff unificado"). Aqui diff nos mostra uma única parte do texto, em vez de dois textos separados. Na linha @@ -1,5 +1,5 @@ , a parte -1,5 refere-se ao arquivo1.txt e a parte +1,5 ao arquivo2.txt. Eles nos dizem que diff mostrará um trecho de texto, que tem 5 linhas a partir da linha número 1 no arquivo1.txt. E o mesmo sobre o arquivo2.txt - diff nos mostra 5 linhas a partir da linha 1.

Como eu já disse, as linhas de ambos os arquivos são mostradas juntas

 this is the original text  
 line2  
-line3  
 line4  
 happy hacking !  
+GNU is not UNIX  

Aqui - indica as linhas, que foram excluídas do arquivo1.txt e + indica as linhas adicionadas.

    
por 15.07.2015 / 11:35
17

Resumo :

Dado um diff file1 file2 , < significa que a linha está faltando em file2 e > significa que a linha está faltando em file1 . Os 3d2 e 5a5 podem ser ignorados, eles são comandos para patch , que é frequentemente usado com diff .

Resposta completa :

Muitos utilitários * nix oferecem manuais do TeXinfo, bem como as páginas man mais simples. você pode acessá-los executando info command , por exemplo, info diff . Neste caso, a seção em que você está interessado é:

2.4.2 Detailed Description of Normal Format


The normal output format consists of one or more hunks of differences; each hunk shows one area where the files differ. Normal format hunks look like this:

 CHANGE-COMMAND
 < FROM-FILE-LINE
 < FROM-FILE-LINE...
 ---
 > TO-FILE-LINE
 > TO-FILE-LINE...

There are three types of change commands. Each consists of a line number or comma-separated range of lines in the first file, a single character indicating the kind of change to make, and a line number or comma-separated range of lines in the second file. All line numbers are the original line numbers in each file. The types of change commands are:

'LaR'
     Add the lines in range R of the second file after line L of the
     first file.  For example, '8a12,15' means append lines 12-15 of
     file 2 after line 8 of file 1; or, if changing file 2 into file 1,
     delete lines 12-15 of file 2.

'FcT'
     Replace the lines in range F of the first file with lines in range
     T of the second file.  This is like a combined add and delete, but
     more compact.  For example, '5,7c8,10' means change lines 5-7 of
     file 1 to read as lines 8-10 of file 2; or, if changing file 2 into
     file 1, change lines 8-10 of file 2 to read as lines 5-7 of file 1.

'RdL'
     Delete the lines in range R from the first file; line L is where
     they would have appeared in the second file had they not been
    
por 06.07.2013 / 18:29
3

Eu sugiro usar:

diff -rupP file1.txt file2.txt > result.patch

Então, quando você ler result.patch , saberá instantaneamente a diferença.

Estes são os significados das opções de linha de comando:

-r : recursivo

-u : mostra o número da linha

-p (small): mostra diferenças nas funções C

-P (capital): no caso de vários arquivos, o caminho completo é mostrado

    
por 15.07.2015 / 13:03
1

As respostas acima são boas. No entanto, como iniciante, achei-os um pouco difícil de entender e, ao procurar mais, encontrei um link muito útil: Comando Linux Diff & Exemplos

O site explica o conceito de maneira simples e fácil de entender.

O comando Diff é mais fácil de entender se você considerar da seguinte maneira:

Essentially, it outputs a set of instructions for how to change one file to make it identical to the second file.

Cada um dos casos a seguir é bem explicado:

a for add, c for change, d for delete

    
por 23.04.2018 / 09:34
0

Renomeie as coisas para ajudar você a lembrar!

diff  <file-to-edit>  <file-with-updates>   #Rather than diff f1 f2

Os resultados operam no arquivo para edição (file1), aplicando várias atualizações a ele.

Similaridade, acho que essas renomeações ajudam a conceituar os resultados:

Excluir = 'remover' & Add = 'insert'.

2,4d1 --- D (s) - d -N --- d elete (' remover ') linha D (s) Em seguida, sincronize na linha N em ambos.

4a2,4 --- N- a -U (s) --- Na linha N, a dd (' insert ') linha (s) da atualização U

Nota: Eles são quase simétricos.

Alterar = 'remover & inserir '.

2,4c5,6 --- R (s) - c -U (s) --- Remova as linhas R (s), depois insira linhas atualizadas U (s) no lugar delas .

Por exemplo:

4a2,4 --- a partir de 4, adicionar linhas atualizadas 2-4 (isto é, 2,4 significa 2, 3 e 4)

2,4d1 --- remova as linhas 2-4.

2,4c5,6 --- remova as linhas 2-4 e insira as linhas atualizadas 5-6

  • Eu sei que estes são comandos do editor de fluxo e projetados para serem processados por uma máquina. Por exemplo, é realmente o comando ed adicionar, não inserir, mas é mais útil para mim pensar em inserir, que é o que no final está sendo feito para o arquivo. Eles usam operações de fluxo, mas eu gosto de pensar em termos de resultados.

por 23.11.2018 / 00:48