Como posso obter o diff para mostrar apenas linhas adicionadas e excluídas? Se o diff não pode fazê-lo, que ferramenta pode?
69
Como posso obter o diff para mostrar apenas linhas adicionadas e excluídas? Se o diff não pode fazê-lo, que ferramenta pode?
diff A B | grep '^[<>]'
comm
.Respostas:
Tente comm
Outra maneira de ver isso:
Mostrar linhas que existem apenas no arquivo a: (ou seja, o que foi excluído de a)
Mostrar linhas que existem apenas no arquivo b: (ou seja, o que foi adicionado a b)
Mostrar linhas que existem apenas em um arquivo ou no outro: (mas não ambos)
(Aviso: se o arquivo
a
tiver linhas que começam com TAB, ele (o primeiro TAB) será removido da saída.)Apenas arquivos classificados
NOTA: Os dois arquivos precisam ser classificados para
comm
funcionarem corretamente. Se eles ainda não estiverem classificados, você deve classificá-los:Se os arquivos forem extremamente longos, isso pode ser um fardo, pois requer uma cópia extra e, portanto, duas vezes mais espaço em disco.
fonte
comm -12 <(sort a) <(sort b)
comm
pode fazer o que quiser. Na sua página de manual:Estas colunas são suppressable com
-1
,-2
e-3
respectivamente.Exemplo:
E se você quer apenas as linhas exclusivas e não se importa em qual arquivo elas estão:
Como diz a página do manual, os arquivos devem ser classificados com antecedência.
fonte
Para mostrar adições e exclusões sem contexto, números de linhas, +, -, <,>! etc, você pode usar o diff assim:
Por exemplo, dados dois arquivos:
a.txt
b.txt
O comando a seguir mostrará as linhas removidas de a ou adicionadas a b:
resultado:
Este comando ligeiramente diferente mostrará as linhas removidas do a.txt:
resultado:
Por fim, este comando mostrará linhas adicionadas ao a.txt
resultado
fonte
Isso é o que diff faz por padrão ... Talvez você precise adicionar alguns sinalizadores para ignorar o espaço em branco?
deve ignorar linhas em branco e diferentes números de espaços.
fonte
Não,
diff
na verdade não mostra as diferenças entre dois arquivos da maneira que se pensa. Ele produz uma sequência de comandos de edição para uma ferramenta quepatch
é usada para mudar um arquivo para outro.A dificuldade para qualquer tentativa de fazer o que você está procurando é como definir o que constitui uma linha que foi alterada versus uma excluída, seguida por uma adicionada. Também o que fazer quando as linhas são adicionadas, excluídas e alteradas adjacentes umas às outras.
fonte
diff
fontes, mas me lembro de todos os tipos de variações para acompanhar onde dois arquivos correspondem para ficar sincronizados e acho que há um limite para desistir com base na distância entre os arquivos. linhas são. Mas não me lembro de nenhuma correspondência intra-linha, exceto pelo espaço em branco recolhido (opcionalmente) ou caso de ignorância. Ou (talvez) palavras para esse efeito. De qualquer forma, tudo sepatch
resume e o "vgrep" aparece para o passeio. Talvez. Na terça-feira.As ferramentas de comparação visual ajustam dois arquivos, para que um segmento com o mesmo número de linhas, mas com conteúdo diferente, seja considerado um segmento alterado. Linhas completamente novas entre segmentos correspondentes são consideradas segmentos adicionados.
É também assim que a ferramenta de linha de comando sdiff funciona, que mostra uma comparação lado a lado de dois arquivos em um terminal. As linhas alteradas são separadas por | personagem. Se uma linha existir apenas no arquivo A, <será usado como caractere separador. Se uma linha existir apenas no arquivo B,> será usado como separador. Se você não tiver caracteres <e> nos arquivos, poderá usar isso para mostrar apenas linhas adicionadas:
fonte
Obrigado senarvi, sua solução (que não foi votada) na verdade me deu EXATAMENTE o que eu queria depois de procurar por séculos em várias páginas.
Usando sua resposta, aqui está o que eu criei para alterar a lista / adicionar / excluir. O exemplo usa 2 versões do arquivo / etc / passwd e imprime o nome de usuário para os registros relevantes.
fonte
Acho esse formulário em particular frequentemente útil:
Exemplo:
Resultado:
Portanto, mostra as linhas antigas com
-
seguidas imediatamente pela nova linha correspondente com+
.Se tivéssemos uma exclusão de
C
:Se parece com isso:
O formato está documentado em
man diff
:e:
e:
Pergunta relacionada: https://stackoverflow.com/questions/15384818/how-to-get-the-difference-only-additions-between-two-files-in-linux
Testado no Ubuntu 18.04.
fonte
Arquivo1:
Arquivo2:
Usar:
Isso mostra duas colunas para arquivos de perspectivas.
Resultado:
fonte