Mostrar apenas lado direito do lado-a-lado diff

4

Eu não pareço encontrar uma maneira de contornar isso. Existe um one-liner para obter apenas o lado direito de uma saída diff --side-by-side ?

Por exemplo:

Para isso: diff --side-by-side file1 file2 obtenho um desses dois tipos de resultados:

  2 Africa                            |   3 Africa
  3 America                               3 America    
  3 Asia                                  3 Asia
  4 Antarctica                            4 Antarctica
  4 Oceania                               4 Oceania
  7 Europe                                7 Europe

ou

  3 Africa                                3 Africa
  3 America                               3 America
  3 Asia                              <
  4 Antarctica                            4 Antarctica
                                      >   4 Asia
  4 Oceania                               4 Oceania
  8 Europe                                8 Europe

Como posso transformar isso em:

| 3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

E isto respectivamente:

  3 Africa
  3 America
  4 Antarctica
> 4 Asia
  4 Oceania
  8 Europe

Observe que editei a saída original de diff para que pareça justificada nessa questão. Eles aparecem alinhados (em termos de coluna) no terminal, mas eu tive que ajustá-los um pouco para que eles aparecessem exatamente como aparecem no terminal (colunas bem alinhadas), mas você pode replicar a saída criando esses arquivos de entrada:

Versão 1 do arquivo 1

  2 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

File2 versão 1

  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

Versão 2 do arquivo1

  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  8 Europe

File2 versão 2

  3 Africa
  3 America
  4 Antarctica
  4 Asia
  4 Oceania
  8 Europe
    
por Tulains Córdova 20.02.2017 / 22:05

2 respostas

4

O que você parece querer não é um diff lado-a-lado - mas sim um no qual você personaliza o formato para excluir completamente as linhas do arquivo antigo ou do novo. Por exemplo, dado

$ cat file1v1
  2 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe
$ cat file2v1
  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

Então

$ diff --new-line-format='| %L' --unchanged-line-format='  %L' --old-line-format= file1v1 file2v1
|   3 Africa
    3 America
    3 Asia
    4 Antarctica
    4 Oceania
    7 Europe

enquanto dado

$ cat file1v2
  3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  8 Europe

$ cat file2v2
  3 Africa
  3 America
  4 Antarctica
  4 Asia
  4 Oceania
  8 Europe

então

$ diff --new-line-format='> %L' --unchanged-line-format='  %L' --old-line-format= file1v2 file2v2
    3 Africa
    3 America
    4 Antarctica
>   4 Asia
    4 Oceania
    8 Europe
    
por steeldriver 21.02.2017 / 00:00
2

Esta é, na verdade, a coluna DIREITA, embora termine à esquerda. Além disso, é uma solução muito feia e tenho certeza de que algumas pessoas mais inteligentes farão melhor. Mas aqui está mesmo assim:

$ diff --side-by-side file1 file2 | sed -r 's/[^\t]*\t*(.*)//' | sed -r 's/^ *(\||>|<)\t //'

| 3 Africa
  3 America
  3 Asia
  4 Antarctica
  4 Oceania
  7 Europe

Explicação

  • -r use ERE
  • s/old/new/ replace old com 'novo
  • [^\t]* , exceto guias, por favor
  • \t* , quantas guias você quiser
  • (.*) qualquer número de caracteres na linha, (salvo) para mais tarde
  • do padrão que salvamos
  • s/^ *(\||>|<)\t // livra-se do material em torno do caractere | ou > ou < em linhas que diferem para corrigir o alinhamento
por Zanna 20.02.2017 / 23:31