Diff relata diferença, mas ambas as linhas são iguais

55

Eu diferenciei 2 arquivos e consegui

1c1
< 1
---
> 1

Ambos os arquivos continham apenas "1". Como isso é diferente?

Jiew Meng
fonte
postar o conteúdo de ambos os arquivos agradar;)
Rinzwind
5
Se você estiver usando diff, a -uopção pode ser mais legível para humanos.
Lekensteyn
@Rinzwind, ambos os arquivos contêm apenas o texto 1, mas se você quiser ver mais olhar pastebin.com/byiqdie1
Jiew Meng
Desculpa. Não acontece quando eu faço isso. Deve haver algo diferente. Não um cp 1 2(assim substituir 2) e, em seguida, você pode ser 100% b certeza de que eles são os mesmos;)
Rinzwind
2
vimdiff file1 file2? : D
dylnmc 24/11/2015

Respostas:

68

1a linha: asignifica adicionado, dexcluído e calterado. Os números de linha do arquivo original aparecem antes dessas letras e os do arquivo modificado aparecem depois da letra.

2ª linha: a linha com <é do arquivo 1 e é diferente do arquivo 2.

A terceira linha é um divisor.

4ª linha: a linha com >é do arquivo 2 e é diferente do arquivo 1.

(Se você vir =isso significa que as linhas são iguais nos dois arquivos)

E seu problema pode ser espaços em branco ou outros caracteres legíveis não humanos: eles também provocam uma diferença.

Existem algumas opções para manipular a saída.

Exemplo:

rinzwind @ discworld: ~ $ mais 1 
teste
test2
test3
rinzwind @ discworld: ~ $ mais 2
teste
test2  
test3

formato de contexto:

rinzwind @ discworld: ~ $ diff -c 1 2
*** 1 2011-08-13 17: 05: 40.433966684 +0200
--- 2 2011-08-13 17: 11: 24.369966629 +0200
***************
*** 1,3 ****
  teste
! test2
  test3
--- 1,3 ----
  teste
! test2  
  test3

UMA "!" representa uma alteração entre as linhas que correspondem nos dois arquivos. Um "+" representa a adição de uma linha, enquanto um espaço em branco representa uma linha inalterada. No início do patch estão as informações do arquivo, incluindo o caminho completo e o registro de data e hora. No início de cada pedaço são os números de linha que se aplicam à alteração correspondente nos arquivos. Um intervalo numérico que aparece entre conjuntos de três asteriscos se aplica ao arquivo original, enquanto conjuntos de três hífens se aplicam ao novo arquivo. Os intervalos do hunk especificam os números de linha inicial e final no respectivo arquivo.

Expandindo o comentário de Lekensteyn sobre o formato unificado:

rinzwind @ discworld: ~ $ diff -u 1 2
--- 1 2011-08-13 17: 05: 40.433966684 +0200
+++ 2 2011-08-13 17: 11: 24.369966629 +0200
@@ -1,3 +1,3 @@
 teste
-test2
+ test2  
 test3

O formato começa com o mesmo cabeçalho de duas linhas que o formato de contexto, exceto que o arquivo original é precedido por "---" e o novo arquivo é precedido por "+++". A seguir, estão um ou mais blocos de alterações que contêm as diferenças de linha no arquivo. As linhas contextuais inalteradas são precedidas por um caractere de espaço, as linhas adicionais são precedidas por um sinal de mais e as linhas de exclusão são precedidas por um sinal de menos.

Algumas opções úteis:

-b Ignore as alterações na quantidade de espaço em branco.

-w Ignore todo o espaço em branco.

-B Ignore todas as linhas em branco.

-y saída em 2 colunas.

Rinzwind
fonte
Como verifico se existem caracteres ocultos? Existe alguma maneira de ignorar caracteres ocultos (talvez apenas excluindo novas linhas e guias?) Suponho que a maioria dos caracteres ocultos são acidentais?
precisa saber é o seguinte
Eu coloquei em algumas opções úteis (copiados de man diff;))
Rinzwind
Percebo que o uso do sinalizador -b funciona. Hmm eu não vejo diferença no espaço em branco no gedit :)
Jiew Meng
@JiewMeng Execute od -x1znos dois arquivos e compare a odsaída. Ele deve encontrar diferenças ocultas entre os arquivos.
Lgarzo 03/09
6

Acho que od (octal dump) é útil ao comparar arquivos com caracteres não imprimíveis (particularmente arquivos que diff decide serem "binários" e, portanto, informa apenas que eles diferem).

No exemplo abaixo, eu crio um par de arquivos que podem ser como os originais e, em seguida, faço uma comparação com a saída original; Em seguida, eu difiro em algumas saídas "od" diferentes.

$ echo 1> 1
$ echo "1"> 2
$ diff 1 2

1c1  
< 1  
- ---  
> 1   

$ od -c 1> 1.od
$ od -c 2> 2.od
$ diff 1.od 2.od

1,2c1,2
< 0000000   1  \n
< 0000002
---
> 0000000   1      \n
> 0000003

$ od -Ax -c -t x1 1> 1.od
$ od -Ax -c -t x1 2> 2.od
$ diff 1.od 2.od

1,3c1,3
< 000000   1  \n
<         31  0a
< 000002
---
> 000000   1      \n
>         31  20  0a
> 000003
Charles Boling
fonte
1

Eu tive o mesmo problema e encontrei uma solução que pode ajudar, use o comando:

dos2unix <file1> <file2>

um deles pode estar no formato dos / windows e o outro no formato UNIX

depois que eu fiz isso o diff estava tudo bem!

levk
fonte
0

Não tenho certeza se isso ajuda a encontrar caracteres em branco difíceis de encontrar, mas é útil para diferenciar: http://www.gnu.org/software/wdiff/

David Winiecki
fonte