2013-04-05 6 views
5

Ich habe oft eine Notwendigkeit, zwei Dateien zu vergleichen, während bestimmte Änderungen in diesen Dateien zu ignorieren. Ich möchte nicht ganze Zeilen ignorieren, nur einen Teil von ihnen. Der häufigste Fall sind Zeitstempel auf den Zeilen, aber es gibt ein paar Dutzend andere Muster, die ich auch ignorieren muss.diff beim Ignorieren von Mustern innerhalb einer Zeile, aber nicht die gesamte Zeile

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 diesem Beispiel möchte ich den Unterschied auf der Linie 1, um zu sehen, aber nicht auf Zeilennummer 2.

diff der Verwendung -I Option wird nicht funktionieren, da es die gesamte Zeile ignoriert. Ideal Ausgang:

--- 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 

kann ich vorverarbeitet diese Dateien mit sed:

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

aber dann muss ich irgendwo diese temporären Dateien setzen, und daran denken, sie danach zu reinigen. Außerdem verweist meine Diff-Ausgabe nicht mehr auf die ursprünglichen Dateinamen und gibt nicht mehr die ursprünglichen Zeilen aus.

Gibt es eine weit verbreitete Variante von diff oder ein ähnliches Werkzeug, das dies als einen einzigen Befehl ausführen kann?

Antwort

1

Es ist nicht genau das, was Sie suchen, da ich nicht sicher bin, wie die Daten zu behalten, aber ein paar Ihre Probleme löst:

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

Ausgang:

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

Ich denke, die Daten können mit etwas wie '--label = "file1 $ (stat --printf"% y "file1)"' enthalten sein. Es hört sich so an, als käme es mir am nächsten, wenn ich nicht auf die diffutils-Quellen hacke. – Eric

1

können Sie temporäre Ströme verwenden, um Dateierstellung und Bereinigung zu vermeiden, Syntax folgt:

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

In Ihrem Fall:

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

Hoffnung, das hilft.

+1

Genau. Wie Kernighan in den klassischen * Software Tools * sagte, bereiten Sie Ihre Daten so weit wie möglich vor, um die letzte Aufgabe so einfach wie möglich zu machen. –

Verwandte Themen