Compreensão da saída diff


89

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.txteu recebo:

3d2  
< line3  
5a5  
> GNU is not UNIX  

Como a saída é geralmente interpretada? Eu acho que isso <significa removido, mas o que significa 3d2ou não 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 @@ -1,5 +1,5 @@significa?

Respostas:


98

Na sua primeira diffsaída (chamada "normall diff"), o significado é o seguinte

< - indica linhas no arquivo1.txt

> - indica linhas no arquivo2.txt

3d2e 5a5denotar números de linha afetados e quais ações foram executadas. dsignifica exclusão, asignifica adição (e csignifica 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. Então, 3d2informa que a terceira linha do arquivo1.txt foi excluída e possui o número da linha 2 no arquivo2.txt (ou melhor, após a exclusão, o contador de linhas voltou à linha número 2). 5a5informa que começamos a partir da linha número 5 no arquivo1.txt (que estava realmente vazio depois que excluímos uma linha na ação anterior), adicionamos a linha e essa linha adicionada é o número 5 no arquivo2.txt.

A saída do diff -ucomando é formatada um pouco diferente (o chamado formato "diff unificado"). Aqui diffnos mostra uma única parte do texto, em vez de dois textos separados. Na linha, @@ -1,5 +1,5 @@a parte -1,5se refere ao arquivo1.txt e a parte +1,5ao arquivo2.txt. Eles nos dizem que diffirá mostrar um pedaço de texto, com 5 linhas, começando na linha 1 do arquivo1.txt. E o mesmo sobre o arquivo2.txt - diffmostra 5 linhas a partir da linha 1.

Como eu já disse, as linhas dos dois 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 que foram adicionadas.


25

Resumo :

Dado a diff file1 file2, <significa que a linha está ausente file2e >significa que a linha está ausente file1. O 3d2e 5a5pode ser ignorado, são comandos para os patchquais é frequentemente usado diff.

Resposta completa :

Muitos utilitários * nix oferecem manuais do TeXinfo, além de manpáginas mais simples . você pode acessá-los executando info command, por exemplo info diff. Nesse caso, a seção em que você está interessado é:

2.4.2 Descrição detalhada do formato normal


O formato de saída normal consiste em um ou mais pedaços de diferenças; cada pedaço mostra uma área em que os arquivos diferem. Pedaços de formato normal ficam assim:

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

Existem três tipos de comandos de alteração. Cada um consiste em um número de linha ou intervalo de linhas separado por vírgula no primeiro arquivo, um único caractere indicando o tipo de alteração a ser feito e um número de linha ou intervalo de linhas separado por vírgula no segundo arquivo. Todos os números de linha são os números de linha originais em cada arquivo. Os tipos de comandos de alteração são:

`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

4

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 da linha de comandos:

-r : recursivo

-u : mostra o número da linha

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

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


3

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

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

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

Essencialmente, ele fornece um conjunto de instruções sobre como alterar um arquivo para torná-lo idêntico ao segundo arquivo.

Cada um dos seguintes casos é bem explicado:

a para adicionar, c para alterar, d para excluir


2

Renomeie as coisas para ajudá-lo a se lembrar!

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

Os resultados operam no arquivo a editar (arquivo1), aplicando várias atualizações a ele.


Semelhança, acho essas renomeações úteis para conceituar os resultados:

Excluir = 'remover' e Adicionar = 'inserir'.

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

4a2,4 --- N- a -U (s) --- Na linha N, as linhas de uma atualização dd (' inserir ') U

Nota: Eles são quase simétricos.


Alterar = 'remover e inserir'.

2,4c5,6 --- R (s) - c -U (s) --- Remova as linhas de R (s) e insira as linhas U (s) atualizadas em seu lugar.



Por exemplo:

4a2,4 --- começando em 4, adicione as linhas 2-4 atualizadas (ou seja, 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 esses são comandos do editor de fluxo e projetados para serem processados ​​por uma máquina. Por exemplo, é realmente o comando ed add, não insert, mas é mais útil pensar em insert, que é o que, no final, está sendo feito no arquivo. Eles usam operações de fluxo, mas eu gosto de pensar em termos de resultados.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.