Mesclar vários arquivos com no máximo 1 diferença de linha

2

Suponha que eu tenha os seguintes arquivos:

file0.c:

int b=NULL;
int a=NULL;

file1.c:

int b;
int a=NULL;

arquivo2.c:

int b;
int a=NULL;

Estou procurando mesclar os arquivos file1 e file2 para gerar o seguinte resultado.c:

int b;
int a;

Eu posso usar: diff input0 input1 e diff input0 input2 para obter as combinações linha + coluna, no entanto, não sei o que fazer a seguir para alcançar os resultados acima.

    
por user1479589 23.02.2014 / 18:38

1 resposta

0

Parece que file2.c deve ser:

int b=NULL;
int a;

em vez de uma cópia de file1.c .

Com essa alteração, o que podemos entender é que file0.c é um ancestral comum (a "base de mesclagem") para file1.c e file2.c , cada qual corrigindo metade do erro de usar NULL para inicializar int variables.

Se as alterações não estivessem tão próximas, poderíamos usar diff3 -m file1.c file0.c file2.c . Infelizmente, isso apenas produzirá um marcador de conflito.

No entanto, se sabemos que o que está acontecendo não é nada além de substituições de uma linha - ou seja, nenhuma linha está sendo adicionada, removida ou movida, apenas fixada no lugar - podemos obter os dois deltas 0-1 e 0-2 como ed script difere com diff -e . Podemos catenar esses scripts e usar ed para aplicá-los.

Primeiro, vamos fazer uma cópia do file0.c chamado test.c . Vamos tentar aplicar essas alterações em test.c :

$ cp file0.c test.c

Agora, vamos coletar as correções do estilo ed :

$ (diff -e file0.c file1.c ; diff -e file0.c file2.c) > patch

Como eles se parecem?

$ cat patch
1c
int b;
.
2c
int a;
.

Isso parece muito com os comandos corretos para transformar test.c no arquivo mesclado desejado. O que está faltando é o wq para salvar:

$ echo wq >> patch

Agora vamos tentar:

$ cat test.c
int b=NULL;
int a=NULL;
$ ed test.c < patch
ed test.c < patch
24
14
$ cat test.c
int b;
int a;

Feito.

    
por 15.07.2017 / 03:38