diff - mostrando linhas alteradas em seções diferentes das linhas inseridas

2

(Eu estou correndo para isso em um contexto de uso do vimdiff, que depende e interpreta a saída do diff, então eu acho que esta é uma questão diff.)

Dados estes arquivos, o primeiro com 2 linhas, o segundo com 4, o diff (GNU 3.3) mostra os arquivos completos.

< 09/02/2014 | CFCU Checking          | PAYPAL |      12.99 |            | 12.99
< 09/03/2014 | CFCU Checking          | PAYPAL |      24.45 |            | 37.44
---
> 09/02/2014 | Expenses : Advertising | Closed |            |      12.99 | 12.99
> 09/02/2014 | CFCU Checking          | PAYPAL |      12.99 |            | 0.00
> 09/03/2014 | Expenses : Advertising | Closed |            |      24.45 | 24.45
> 09/03/2014 | CFCU Checking          | PAYPAL |      24.45 |            | 0.00

Isso faz com que o vimdiff veja como virtualmente nenhum conteúdo compartilhado. Como mostrado na parte superior da imagem abaixo, ele mostra os 13 primeiros caracteres da linha 1, os 4 primeiros da linha 2 e as linhas 3 e 4 como novas.

Eu gasto muito tempo nesta situação adicionando novas linhas no lugar das linhas inseridas, para forçar o diff (e por sua vez o vimdiff) a mostrá-lo como o meio da imagem abaixo.

Existe uma maneira de fazer o diff melhorar melhor, então o vimdiff o veria como a parte inferior da imagem? (Que eu Photoshoped.)

Ele precisaria de 4 seções, em vez do 1 mostrado acima. Algo como:

#,#c#,#
---
> 09/02/2014 | Expenses : Advertising | Closed |            |      12.99 | 12.99
#,#c#,#
< 09/02/2014 | CFCU Checking          | PAYPAL |      12.99 |            | 12.99
---
> 09/02/2014 | CFCU Checking          | PAYPAL |      12.99 |            | 0.00
#,#c#,#
---
> 09/03/2014 | Expenses : Advertising | Closed |            |      24.45 | 24.45
#,#c#,#
< 09/03/2014 | CFCU Checking          | PAYPAL |      24.45 |            | 37.44
---
> 09/03/2014 | CFCU Checking          | PAYPAL |      24.45 |            | 0.00

A propósito, o vimdiff pode usar diferentes opções de diferenças, através de diffexpr , mas requer diffs de estilo padrão (eu acho chamado ed ).

Então, acho que o que estou procurando é uma maneira de fazer o diff não misturando uma linha alterada e uma linha inserida na mesma seção.

    
por user1902689 18.06.2016 / 00:14

1 resposta

1

Uma abordagem que geralmente funciona é aumentar a quantidade de contexto , para que pequenas diferenças adjacentes sejam coletadas em uma exibição mais coesa.

  • Na linha de comando diff , você faria isso com o -C opção.
  • Com vimdiff , você faria isso com o diffopt e o recurso context , por exemplo, este é o padrão implícito:
    set diffopt=filler,context:6

e você pode mudar isso, por exemplo,

    set diffopt+=context:9
    set diffopt=filler,context:9

Além disso:

  • o utilitário diff subjacente não tem como detectar que as linhas são trocadas entre si.
  • nem tem como comparar arquivos ignorando certas colunas.

O exemplo dado parece ser uma série de transações por data. Se houver alguma outra ordenação (que tende a fazer pedaços maiores de linhas inalteradas), a reordenação dos dados ajudaria.

Em princípio, você poderia usar o diffexpr configuração e construção de um script que pré / pós-processa seus dados, de modo que apenas determinadas colunas sejam comparadas. Usei essa abordagem um tempo atrás para criar um utilitário de comparação de formato livre (nível de palavra). Mas fazer isso é uma boa quantidade de trabalho, e não é simples devido à incapacidade do diff de ignorar colunas de sua entrada.

    
por 18.06.2016 / 01:12

Tags