Comando Linux sdiff
Em sistemas operacionais do tipo Unix, o comando sdiff compara dois arquivos lado a lado, opcionalmente os mescla interativamente e gera os resultados.
Este documento cobre a versão GNU / Linux do sdiff .
Descrição
O sdiff realiza uma comparação lado a lado das diferenças entre FILE1 e FILE2 e, opcionalmente, as mescla (consulte a opção -o , abaixo).
Se um dos FILE s for especificado como um traço (” – “), o sdiff lê da entrada padrão .
Sintaxe
sdiff [ OPÇÃO ] ... FILE1 FILE2
Opções
-o ARQUIVO , – saída = ARQUIVO | Mesclar os arquivos interativamente e enviar a saída para FILE . A especificação dessa opção iniciará a comparação lado a lado e o colocará em um prompt ” % ” , perguntando como tratar as diferenças. Pressione enter no prompt para visualizar as opções de mesclagem, que são as seguintes:
Quando a mesclagem estiver concluída, o conteúdo mesclado será gravado em FILE . | ||||||||||||||||||||
-i , –ignore-case | Trate as letras maiúsculas e minúsculas como se fossem iguais. | ||||||||||||||||||||
-E , –ignore-tab-expansion | Ignore as alterações devido à expansão da guia (onde as guias são expandidas para espaços em branco ou espaços). | ||||||||||||||||||||
-b , –ignore-space-change | Ignore as alterações na quantidade de espaço em branco (espaços, guias, etc). | ||||||||||||||||||||
-W , –ignore-all-space | Ignore todo o espaço em branco. | ||||||||||||||||||||
-B , –ignore-blank-lines | Ignore as alterações cujas linhas estão todas em branco. | ||||||||||||||||||||
-I RE , –ignore-matching-lines = RE | Ignore as alterações cujas linhas correspondem à expressão regular RE . | ||||||||||||||||||||
–strip-trailing-cr | Retorno de carro à direita da faixa na entrada. | ||||||||||||||||||||
-a , –text | Trate todos os arquivos como arquivos de texto. | ||||||||||||||||||||
-w NUM , –width = NUM | Saída na maioria das colunas de impressão NUM (padrão 130 ). | ||||||||||||||||||||
-l , – coluna esquerda | Saída apenas a coluna esquerda de linhas comuns. | ||||||||||||||||||||
-s , –suppress-common-lines | Não produza linhas comuns. | ||||||||||||||||||||
-t , –expand-tabs | Expanda guias para espaços na saída. | ||||||||||||||||||||
–tabsize = NUM | Definir paradas de tabulação em todas as NUM (padrão 8 ) colunas de impressão. | ||||||||||||||||||||
-d , –minimal | Tente encontrar um conjunto menor de alterações. | ||||||||||||||||||||
-H , – arquivos grandes de velocidade | Suponha arquivos grandes (que contêm muitas pequenas alterações espalhadas). | ||||||||||||||||||||
–diff-program = PROGRAMA | Use PROGRAM para comparar arquivos. | ||||||||||||||||||||
–Socorro | Exiba uma mensagem de ajuda e saia. | ||||||||||||||||||||
-v , –version | Informações de versão de saída e saída. |
Exibindo diferenças lado a lado
O sdiff produz uma lista de diferenças lado a lado dos dois arquivos. O conteúdo dos arquivos está listado em duas colunas com uma “calha” entre eles. A calha contém um dos seguintes marcadores:
espaço em branco | As linhas correspondentes são em comum. Ou seja, as linhas são idênticas ou a diferença é ignorada devido a uma das opções –ignore (consulte Manipulação de espaço em branco , abaixo). |
| | As linhas correspondentes diferem e são completas ou incompletas. |
< | Os arquivos diferem e apenas o primeiro arquivo contém a linha. |
> | Os arquivos diferem e apenas o segundo arquivo contém a linha. |
( | Somente o primeiro arquivo contém a linha, mas a diferença é ignorada. |
) | Somente o segundo arquivo contém a linha, mas a diferença é ignorada. |
\ | As linhas correspondentes diferem e apenas a primeira linha está incompleta. |
/ | As linhas correspondentes diferem e apenas a segunda linha está incompleta. |
Normalmente, uma linha de saída está incompleta se, e somente se, as linhas que ela contém estiverem incompletas. No entanto, quando uma linha de saída representa duas linhas diferentes, uma pode estar incompleta enquanto a outra não. Nesse caso, a linha de saída está completa, mas a calha é marcada como ” \ ” se a primeira linha estiver incompleta, ” / ” se a segunda linha estiver.
O formato lado a lado às vezes é mais fácil de ler, mas possui limitações. Ele gera uma saída muito mais ampla que o normal e trunca a exibição de todas as linhas que são muito longas para caber. Além disso, ele baseia-se em alinhar mais fortemente a saída do que o habitual, portanto sua saída parecerá especialmente ruim se você usar fontes de largura variável, paradas de tabulação fora do padrão ou caracteres não imprimíveis .
Como lidar com diferenças de espaço em branco
A opção –ignore-tab-expansion ( -E ) ignora a distinção entre guias e espaços na entrada. Uma tabulação é considerada equivalente ao número de espaços para a próxima parada de tabulação.
A opção –ignore-trailing-space ( -Z ) ignora o espaço em branco no final da linha.
A opção –ignore-space-change ( -b ) é mais forte que -E e -Z combinadas. Ele ignora o espaço em branco no final da linha e considera todas as outras seqüências de um ou mais caracteres de espaço em branco em uma linha como equivalentes. Com esta opção, o sdiff considera as duas linhas a seguir equivalentes, onde ‘ $ ‘ indica o final da linha:
Aqui se encontra a muche rychnesse no espaço da lenda. - John Heywood $ Aqui se encontra a muche rychnesse no espaço da lenda. - John Heywood $
A opção –ignore-all-space ( -w ) é ainda mais forte. Ele ignora as diferenças, mesmo que uma linha tenha espaço em branco e a outra linha não a tenha. Caracteres de espaço em branco incluem guia, guia vertical, alimentação de formulário, retorno de carro e espaço; alguns códigos de idioma podem definir caracteres adicionais como espaço em branco. Com esta opção, sdiff considera as duas linhas a seguir equivalentes, onde ‘ $ ‘ indica o final da linha e ‘ ^ M ‘ indica um retorno de carro:
Aqui lyeth muche rychnesse no espaço lytell - John Heywood $ Ele confia muito em que Erychnes indica o ritmo. --John Heywood ^ M $
For other programs the newline character is considered a white space character, but sdiff is a line-oriented program and a newline character always ends a line. Hence the -w or –ignore-all-space option does not ignore newline-related changes; it ignores only other white space changes.
Merging Interactively
If you specify an output file using the -o option, sdiff displays differences side-by-side in groups of differing lines, and give you a prompt (“%“) where you can choose, case by case, how to handle the differences to create a merged output file.
For instance, let’s say we have two files, cats.c and cats2.c, shown here side by side:
cats.c: cats2.c: /* │ /* cats, a program. │ "cats", a computer program. Tells you if your cat is alive or dead. │ Tells you if your cat is alive or dead. by E. Schrödinger. │ by E. Schrödinger. */ │ */ │ #include <stdio.h> │ #include <stdio.h> #include <stdlib.h> │ #include <stdlib.h> #include <time.h> │ #include <time.h> │ int main () { │ int main () { │ double numCats; │ /* seed pseudorandomizer */ double chance = (double)rand(); │ srand( time( NULL ) ); │ chance = chance / (double)RAND_MAX; │ double numCats; │ double chance = (double)rand(); if ( chance > 0.5 ) { │ printf("Felix is alive.\n"); │ chance = chance / 1; } else if ( chance < 0.5 ) { │ printf("Felix is not alive.\n"); │ if ( chance > 0.5 ) { } else { │ printf("My cat is alive.\n"); printf("Felix is alive and dead.\n"); │ } else if ( chance < 0.5 ) { } │ printf("My cat is dead.\n"); } │ } else { │ printf("My cat might be alive.\n"); │ } │ }
There are differences in these two files, and we have to decide which ones to keep. Let’s run sdiff on the two files, specifying an output file so sdiff knows we also want to perform a merge:
sdiff -o merged_cats.c cats.c cats2.c
sdiff will output to the screen:
/ * / * gatos, um programa. | "gatos", um programa de computador.
Aqui, vemos as duas primeiras linhas do nosso arquivo – a segunda linha tem diferenças, então o sdiff pára por aí e nos fornece um prompt (” % “). A barra vertical (” | “) está no que é chamado de “sarjeta” – o espaço que separa as duas linhas – e significa que essas duas linhas “se alinham”, ou seja, sua posição nos respectivos arquivos corresponde. Se pressionarmos Enter no prompt, o sdiff nos fornecerá uma breve lista de comandos:
ed: Edit e use as duas versões, cada uma decorada com um cabeçalho. eb: edite e use as duas versões. el ou e1: Edite e use a versão esquerda. er ou e2: Edite e use a versão correta. e: Descarte as duas versões e edite uma nova. l ou 1: use a versão esquerda. r ou 2: use a versão correta. s: inclua silenciosamente linhas comuns. v: inclua verbalmente linhas comuns. q: saia.
Todas as opções que começam com e ( ed , eb , etc.) abrirão um editor ( ed ou vi , por padrão) e nos permitirão editar manualmente as linhas para resolver as diferenças. Por exemplo, se digitar o comando ed na % prompt:
% ed
… veremos o seguinte em nosso editor:
--- cats.c 2 gatos, um programa. +++ cats2.c 2 "gatos", um programa de computador.
Este é um arquivo temporário que mostra nossas duas linhas diferentes, “decoradas com um cabeçalho”: a linha do arquivo 1 possui três traços (” — “), o nome do arquivo e o número da linha; a linha do arquivo 2 possui três sinais de adição (” +++ “), o nome do arquivo e o número da linha. Os cabeçalhos devem ser excluídos e as duas linhas restantes devem ser editadas em uma linha que represente a mesclagem manual. Quando você escreve o arquivo temporário e fecha o editor, o sdiff resolve o problema com o que você salvou (incluindo os cabeçalhos, se você não os excluir, por isso, certifique-se de fazê-lo). Se você não escrever nenhuma alteração, o sdiff usará os cabeçalhos e as linhas inalteradas como resolução, portanto, faça uma edição e escreva as alterações.
Como alternativa, poderíamos ter escolhido l (L minúsculo) ou r para escolher a linha do arquivo 1 ou 2, respectivamente. Nesse caso, digamos que queremos a linha do arquivo 2, então digitaremos r .
% r
O sdiff continuará com o arquivo, solicitando que resolvamos as diferenças sempre que encontrar:
Informa se o seu gato está vivo ou morto. Informa se o seu gato está vivo ou morto. de E. Schrödinger. de E. Schrödinger. * / * / #include <stdio.h> #include <stdio.h> #include <stdlib.h> #include <stdlib.h> #include <time.h> #include <time.h> int main () {int main () { > / * pseudo-randomizador de sementes * / > srand (tempo (NULL)); >
Aqui, os três símbolos ” > ” na sarjeta, antes das últimas três linhas à direita, nos dizem que essas linhas aparecem no arquivo 2, mas não no arquivo 1. Se inserirmos l (L minúsculo), essas linhas serão excluídas de esse bloco de linhas; se inserirmos r , eles serão mantidos. Vamos mantê-los:
% r
O próximo conjunto é exibido:
double numCats; double numCats; chance dupla = (dupla) rand (); chance dupla = (dupla) rand (); chance = chance / (duplo) RAND_MAX; | chance = chance / 1;
A barra vertical na sarjeta na última linha nos diz que essas duas versões de uma linha correspondente diferem e devem ser resolvidas. Em uma análise mais detalhada, a da esquerda, no arquivo 1, é a versão da linha que queremos manter, portanto digitaremos l no prompt:
% l
O próximo conjunto é exibido:
if (chance> 0,5) {if (chance> 0,5) { printf ("Felix está vivo. \ n"); | printf ("Meu gato está vivo. \ n");
Aqui é uma questão de preferência. Vamos manter a versão à direita:
% r
E assim por diante, até o final do arquivo:
} else if ( chance < 0.5 ) { } else if ( chance < 0.5 ) { printf("Felix is not alive.\n"); | printf("My cat is dead.\n");
%r
} else { } else { printf("Felix is alive and dead.\n"); | printf("My cat might be alive.\n");
There are no more differences, so sdiff prints the remaining lines of the file, and returns us to the shell command prompt.
Let’s look at our merged file:
cat merged_cats.c
/* "cats", a computer program. Tells you if your cat is alive or dead. by E. Schrödinger. */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main () { /* seed pseudorandomizer */ srand( time( NULL ) ); double numCats; double chance = (double)rand(); chance = chance / (double)RAND_MAX; if ( chance > 0.5 ) { printf("My cat is alive.\n"); } else if ( chance < 0.5 ) { printf("My cat is dead.\n"); } else { printf("My cat might be alive.\n"); } }
As you can see, our choices were incorporated into the merged file, and the versions we discarded were left out.
Environment Variables
As duas variáveis de ambiente mais relevantes que afetam sdiff (além das configurações de localidade, como LC_ALL ) são as variáveis EDITOR e VISUAL . Eles especificam qual editor e qual editor “visual” você deseja usar por padrão ao editar um arquivo. Essas variáveis devem ser configuradas para o caminho completo do seu editor favorito, por exemplo / usr / bin / vim para vim . Se você não tiver certeza de onde vim está localizado em sua máquina, você pode tentar o que comando:
qual vim
/ usr / bin / vim
No bash , você pode definir a variável e exportá-la da seguinte maneira:
EDITOR = / usr / bin / vim; EDITOR DE EXPORTAÇÃO
O sdiff agora usará o valor dessa variável quando iniciar um editor durante uma mesclagem interativa.
Se nem EDITOR nem VISUAL estiverem definidos, o sdiff assumirá o padrão ed ou vi (provavelmente ed ).
Se ambos EDITOR e VISUAL são definidos, VISUAL substituirá EDITOR .
Exemplos
sdiff file1.txt file2.txt
Compara os arquivos file1.txt e file2.txt lado a lado, exibindo diferenças na saída padrão.
sdiff - <arquivo1.txt arquivo2.txt
Nesta configuração de comando, o sdiff compara o texto que recebe da entrada padrão, que neste caso é o conteúdo de file1.txt e file2.txt .
NotaO sdiff não pode executar uma mesclagem interativa quando o material de origem vem do stdin.
sdiff -o output.txt file1.txt file2.txt
Executa uma mesclagem interativa de file1.txt e file2.txt . As diferenças serão exibidas em blocos, com o contexto, da primeira linha dos arquivos até a última. O sdiff solicitará sempre que for necessário que você decida que ação tomar para resolver as diferenças. Pressione enter no prompt % para obter uma folha de dicas sobre possíveis comandos ou consulte as descrições de comando acima neste documento para obter mais informações.
Quando o final do é alcançado, o sdiff grava um arquivo mesclado, com base em suas decisões, no nome do arquivo especificado output.txt .
Comandos relacionados
diff – Identifique as diferenças entre dois arquivos.
ed – Um simples editor de texto.
ex – modo editor de linha do editor detexto vi .
vi – Editor de texto baseado no modo visual de ex .
vim – Uma versão avançada do vi .