2010-12-13 11 views
26

diff ha un'opzione -I regexp, che ignora le modifiche che inseriscono o eliminano solo le righe che corrispondono all'espressione regolare specificata. Ho bisogno di un analogo di questo per il caso, quando le modifiche sono tra due righe (piuttosto che inserire o eliminare righe).Come ignorare alcune differenze nel comando diff?

Per esempio, voglio ignorare tutte le differenze tra i quali "abXd" e "abYd", per data e XY.

Sembra che diff non abbia questo tipo di capacità. Esiste un'alternativa adatta a diff?

risposta

18

È possibile filtrare i due file tramite sed per eliminare le linee di cui non si cura. Lo schema generale è /regex1/,/regex2/ d per eliminare qualcosa tra righe che corrispondono a due espressioni regolari. Per esempio:

diff <(sed '/abXd/,/abYd/d' file1) <(sed '/abXd/,/abYd/d' file2) 
+1

Grazie per la risposta. 'sed '/ regex/d' file' cancella tutte le linee in' file' dove si verifica una corrispondenza di 'regex'. C'è un modo per cancellare non la linea ma solo la parte corrispondente? – Vahagn

+0

Non sono sicuro di cosa vogliate fare. Puoi modificare la tua domanda con un esempio di due file che vuoi diff e quale vuoi che il risultato sia? –

+0

Sfortunatamente, questo non funzionerà con il diff ricorrente ('-r') per ovvi motivi. –

0

Supponendo che X e Y siano caratteri singoli, quindi -I 'ab[XY]d' funziona correttamente per me.

+0

E anche per me. – user2023370

+6

Ignora completamente la linea. Se ci sono altre differenze nella linea che ti interessa, questo le nasconderà. – CoatedMoose

18

migliorando sul earlier solution da John Kugelman:

diff <(sed 's/ab[XY]d/abd/g' file1) <(sed 's/ab[XY]d/abd/g' file2) 

è probabilmente quello che si può essere cercate! Questa versione normalizza la modifica specifica su ogni riga senza eliminare la linea stessa. Questo permette a diff di mostrare qualsiasi altre differenze che rimangono sulla linea.

1

Si potrebbe utilizzare sed per sostituire le istanze del modello con una stringa standard:

diff <(sed 's/ab[XY]d/ab__REPLACED__d/g' file1) <(sed 's/ab[XY]d/ab__REPLACED__d/g' file2) 
Problemi correlati