Diferença no espaço em branco entre dois arquivos no Linux

14

Eu tenho dois arquivos que quando comparo com diff mostram que cada linha mudou. Quando os comparo com diff -w (ignorando o espaço em branco), ele mostra as poucas alterações mínimas que eu espero.

Obviamente, há alguma diferença entre os espaços em branco em cada arquivo, mas não sei o que são ou como encontrá-los. Eu tentei editar os arquivos para garantir que o espaço em branco é realmente caracteres de espaço (em oposição a guias), mas não tenho certeza do que mais fazer.

Eu usei o vim com :set list on para confirmar que não havia espaço no fim das linhas.

Eu também acredito que cada arquivo tem terminadores de linha Linux, já que o vim não mostrou ^M no final das linhas.

    
por Romski 04.02.2015 / 07:50

6 respostas

6

Para vim usuários, há um utilitário útil para mostrar as diferenças exatas entre os arquivos:

vimdiff file1 file2

Isso colocará cada arquivo nas janelas, lado a lado e diferenças com cores destacadas.

Alguns comandos úteis quando em vimdiff

Enquanto em vimdiff , alguns comandos úteis são:

  • ]c : salte para a próxima alteração

  • [c : salte para a alteração anterior

  • ctrl-W ctrl-W : alterne para outra janela

  • zo : dobras abertas

  • zc : fechar dobras

Exemplo

Este é um exemplo de vimdiff em um xterm comparando duas versões de um arquivo de configuração cups :

Você pode ver que longas seções de linhas idênticas foram recolhidas. Eles podem ser abertos novamente com zo .

O esquema de cores varia dependendo das configurações das opções. No exemplo acima, quando uma linha aparece em um arquivo, mas não no outro, essa linha recebe um fundo azul escuro. No outro arquivo, as linhas ausentes são indicadas por linhas tracejadas. Quando uma linha aparece em ambos os arquivos, mas tem algumas diferenças, as partes inalteradas das linhas têm um fundo rosa e as partes alteradas têm um fundo vermelho.

    
por 04.02.2015 / 08:24
12

No FreeBSD ou na maioria dos sistemas Linux, você pode canalizar a saída do diff através de cat -v -e -t para mostrar as diferenças de espaços em branco.

diff file1 file2 | cat -vet

As guias serão mostradas como ^I , um $ será mostrado no final de cada linha para que você possa ver espaços em branco à direita e os caracteres não imprimíveis serão exibidos como ^X ou M-X .

Se você tem o GNU coreutils (disponível na maioria das distribuições Linux não ocupadas), isso pode ser simplificado para

diff file1 file2 | cat -A

Em sistemas busybox, use catv -vet .

    
por 11.05.2015 / 16:06
2

Um dos arquivos foi editado em uma máquina Windows?

A terminação de linha padrão no Windows é CRLF, onde no Linux é simplesmente LF (e em Macs costumava ser CR, mas suspeito que isso tenha mudado desde o OS X).

Teste wc -l nos arquivos, veja quantas linhas e, em seguida, veja se a diferença de tamanho é igual ao número de linhas (a última linha pode não ser terminada em um arquivo).

    
por 04.02.2015 / 07:55
2

od pode ajudar. O comando Octal Dump pode mostrar o conteúdo em hexadecimal. Isso pode ajudá-lo a ver quais bytes, incluindo bytes nulos ou espaço em branco inesperado, estão em um arquivo. Possíveis causas comuns podem ser LF vs CRLF, tabulações vs espaços, ou ASCII vs Unicode (que muitas vezes podem ter apenas um byte nulo antes de cada byte normalmente visível). od -x filename deve revelar qualquer um desses padrões. Se você quiser uma maneira mais elaborada de visualizar o arquivo, qualquer "editor hexadecimal" pode funcionar bem. A coisa boa sobre od é que, como o comando cut , ele é construído em muitos sistemas Unix. Então, muitas vezes, nenhuma instalação separada é necessária.

Se você precisa que os arquivos sejam mais parecidos, tr pode fazer algumas alterações e sed pode fazer mais. Eu provavelmente começaria com ls -l para ver qual arquivo é maior, depois veria os bytes para ver o que precisa ser alterado e, em seguida, alteraria um dos arquivos para que parecessem mais semelhantes.

    
por 04.02.2015 / 08:24
1

Para descobrir onde os espaços em branco e as guias reais você pode substituí-los usando sed , por exemplo:

$ cat file
  line 1
  line 2
    line 6
        line 7
$ sed 's/ /-/g; s/\t/<tab>/g' file
--line-1
--line-2
<tab>line-6
<tab><tab>line-7

Agora compare os dois arquivos.

    
por 04.02.2015 / 08:11
0

O seguinte conteúdo foi copiado aqui da seção "questão" acima, que foi escrita por Romski.

Tanto vimdiff como diff file1 file2 | cat -A foram muito úteis do ponto de vista das ferramentas.

Por fim, encontrei mais um problema. Alguns dos meus arquivos foram codificados com a BOM UTF-8. Isso foi destacado usando diff file1 file2 | cat -A . Isso se manifestou como M-oM-;M-? no início do arquivo afetado:

$ diff file1 file2 | cat -A
< package com.mycompany;$
---$
> M-oM-;M-?package com.mycompany;$

Embora tenha havido vários problemas, listamos alguns comandos abaixo para aqueles que precisam limpar seus arquivos:

# recursively remove UTF8 BOM
find . -type f -exec sed -i -e '1s/^\xEF\xBB\xBF//' {} \;

# recursively replace CRLF with LF
find . -type f -print0 | xargs -0 dos2unix
    
por 09.08.2017 / 21:20