Eu tenho dois arquivos de configuração, o original do gerenciador de pacotes e o personalizado modificado por mim. Adicionei alguns comentários para descrever o comportamento.
Como posso executar diff
nos arquivos de configuração, pulando os comentários? Uma linha comentada é definida por:
- espaço em branco à esquerda opcional (guias e espaços)
- sinal de hash (
#
) - qualquer outro personagem
A expressão regular (mais simples) pulando o primeiro requisito seria #.*
. Tentei a opção --ignore-matching-lines=RE
( -I RE
) do GNU diff 3.0, mas não consegui fazê-lo funcionar com esse RE. Eu também tentei .*#.*
e .*\#.*
sem sorte. Colocar literalmente a linha ( Port 631
) como RE
não corresponde a nada, nem ajuda a colocar o ER entre barras.
Como sugerido no sabor da regex da ferramenta “diff”, parece estar faltando? , Tentei grep -G
:
grep -G '#.*' file
Isso parece coincidir com os comentários, mas não funciona diff -I '#.*' file1 file2
.
Então, como essa opção deve ser usada? Como posso fazer diff
pular certas linhas (no meu caso, comentários)? Por favor, não sugira grep
o arquivo e compare os arquivos temporários.
fonte
-I
opção faz com que um bloco seja ignorado apenas se todas as suas linhas corresponderem à regexp. Portanto, você pode ignorar uma alteração somente de comentário dessa maneira, mas não as alterações de comentários que estão próximas de uma alteração sem comentários.diff -I
não se comporta como eu esperava. Atualizei minha resposta com um exemplo que esclareceu esse comportamento para mim.Respostas:
De acordo com Gilles, a
-I
opção ignora apenas uma linha se nada mais nesse conjunto corresponder, exceto a correspondência de-I
. Não o compreendi completamente até o testar.O teste
Três arquivos estão envolvidos no meu teste:
Arquivo
test1
:Arquivo
test2
:Arquivo
test3
:Os comandos:
O caminho alternativo
Como até o momento não há resposta para explicar como usar a
-I
opção corretamente, fornecerei uma alternativa que funciona em shells do bash:diff -u
- diff unificado-B
- ignorar linhas em branco<(command)
- um recurso bash chamado substituição de processo que abre um descritor de arquivo para o comando, eliminando a necessidade de um arquivo temporáriogrep
- comando para imprimir linhas (não) correspondentes a um padrão-v
- mostrar linhas não correspondentesE
- use expressões regulares estendidas'^\s*(#|$)'
- uma expressão regular combinando comentários e linhas vazias^
- corresponde ao início de uma linha\s*
- corresponder espaço em branco (tabulações e espaços), se houver(#|$)
corresponde a uma marca de hash ou, alternativamente, ao final de uma linhafonte
Experimentar:
Observe que o regex deve corresponder à linha correspondente nos dois arquivos e corresponde a todas as linhas alteradas no pedaço para funcionar, caso contrário, ainda mostrará a diferença.
Use aspas simples para proteger o padrão da expansão do shell e para escapar dos caracteres reservados à expressão regular (por exemplo, colchetes).
Podemos ler no
diffutils
manual:Esse comportamento também é bem explicado pelo armel aqui .
Relacionado: Como posso executar uma comparação que ignora todos os comentários?
fonte
Depois de pesquisar na web, a maneira alternativa de Lekensteyn é a melhor que encontrei.
Mas eu quero usar a saída dif como patch ... e há um problema porque o número da linha é mantido por nota por causa de "grep -v".
Então, pretendo melhorar esta linha de comando:
Não é perfeito, mas o número da linha é mantido no arquivo de correção.
No entanto, se uma nova linha for adicionada em vez da linha de comentário ... o comentário produzirá um Hunk FAILED ao aplicar patches, como podemos ver abaixo.
teste agora nosso comando
/ dev / fd / 62 e / dev / fd / 63 são arquivos produzidos por substituição de processo. Linha entre "+ nova linha" e "-outro texto" é o caractere de espaço padrão definido em nossa expressão sed para substituir comentários.
E agora, o que está chegando quando aplicamos este patch:
A solução é não usar o formato diff unificado sem -u
agora remendo arquivo arquivo de trabalho (sem garantia de resultado em um processo diff muito complexo).
fonte
diff -U0 one two
para desativar o contexto. Para aplicar patches, existem várias ferramentas que podem ser mais adequadas, como o kdiff3.-U0
opção de desativar o contexto. Nota: kdiff3 é uma ferramenta gráfica. Preciso de ferramenta automática para gerenciar atributos de mesclagem do git.vimdiff
suporta fusões de três vias, pode valer a pena olhar.Eu geralmente ignoro essa desordem por:
grep -v "^#" | cat -s
e diferindo daquelas ou ...vim -d
para olhar para os arquivos. O destaque da sintaxe cuida de tornar as diferenças entre comentários e não comentários bastante óbvias. O realce diferencial da diferença em linha para que você possa ver rapidamente quais valores ou partes de valores foram alterados faz deste o meu favorito.fonte
Aqui está o que eu uso para remover todas as linhas comentadas - mesmo as que começam com uma guia ou espaço - e as em branco:
ou você pode fazer
fonte