2013-04-05 6 views
5

Spesso ho bisogno di confrontare due file, ignorando certe modifiche all'interno di quei file. Non voglio ignorare intere righe, solo una parte di esse. Il caso più comune di questo è il timestamp sulle linee, ma ci sono anche una dozzina di altri pattern che devo ignorare.diff ignorando i pattern all'interno di una linea, ma non l'intera riga

File1:

[2012-01-02] Some random text foo 
[2012-01-02] More output here 

File2:

[1999-01-01] Some random text bar 
[1999-01-01] More output here 

In questo esempio, voglio vedere la differenza sulla linea numero 1, ma non sulla linea numero 2.

Utilizzando diff di L'opzione -I non funziona perché ignora l'intera linea. Uscita ideale:

--- file1  2013-04-05 13:39:46.000000000 -0500 
+++ file2  2013-04-05 13:39:56.000000000 -0500 
@@ -1,2 +1,2 @@ 
-[2012-01-02] Some random text foo 
+[1999-01-01] Some random text bar 
[2012-01-02] More output here 

posso pre-processo di questi file con sed:

sed -e's/^\[....-..-..\]//' <file1> file1.tmp 
sed -e's/^\[....-..-..\]//' <file2> file2.tmp 
diff -u file1.tmp file2.tmp 

ma poi ho bisogno di mettere i file temporanei da qualche parte, e ricordarsi di pulirli dopo. Inoltre, il mio output diff non si riferisce più ai nomi file originali e non emette più le righe originali.

Esiste una variante ampiamente disponibile di diff o uno strumento simile, che può farlo come un singolo comando?

risposta

1

Non è esattamente quello che stai cercando per il dato che non sono sicuro di come mantenere le date, ma questo non risolve un paio dei vostri problemi:

diff -u --label=file1 <(sed 's/^\[....-..-..\]//' file1) --label=file2 <(sed 's/^\[....-..-..\]//' file2) 

uscita:

--- file1 
+++ file2 
@@ -1,2 +1,2 @@ 
- Some random text foo 
+ Some random text bar 
    More output here 
+0

Penso che le date possano essere incluse con qualcosa come "--label =" file1 $ (stat --printf "% y" file1) "". Sembra che questo sia il più vicino che riuscirò a ottenere, a meno che non vada a modificare le fonti di diffutils. – Eric

1

È possibile utilizzare i flussi temporanei per evitare la creazione di file e la pulizia, la sintassi è la seguente:

$ diff <(command with output) <(other command with output) 

Nel tuo caso:

diff <(cat f1 | sed -e's/^\[....-..-..\]//') <(cat f2 | sed -e's/^\[....-..-..\]//') 

Spero che questo aiuti.

+1

Esattamente. Come diceva Kernighan nel classico * Software Tools *, pre-elaborazione dei dati il ​​più possibile per rendere l'attività finale il più semplice possibile. –

Problemi correlati