2013-04-05 13 views
5

Często potrzebuję porównać dwa pliki, ignorując pewne zmiany w tych plikach. Nie chcę ignorować całych linii, tylko ich części. Najczęstszym tego przykładem są sygnatury czasowe na liniach, ale istnieje kilka innych wzorów, które również muszę zignorować.diff ignorując wzorce w linii, ale nie całą linię

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 

W tym przykładzie chcę zobaczyć różnicę na linii numer 1, ale nie na linii numer 2.

Korzystanie diff -I opcja nie będzie działać, ponieważ ignoruje całą linię. Wyjście idealny:

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

mogę wstępne przetworzenie tych plików z sed:

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

ale potem muszę umieścić te pliki tymczasowe gdzieś, i pamiętaj, aby oczyścić je później. Ponadto, moje wyjście diff nie odwołuje się już do oryginalnych nazw plików i nie emituje już oryginalnych linii.

Czy istnieje powszechnie dostępna odmiana diff lub podobne narzędzie, które może wykonać to jako pojedyncze polecenie?

Odpowiedz

1

To nie jest dokładnie to, czego szukasz, ponieważ nie jestem pewien, jak się zachować daty, ale to nie rozwiązuje kilka swoich problemów:

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

wyjściowa:

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

Myślę, że daty mogą być włączone z czymś takim jak "--label =" file1 $ (stat - printf "% y" file1) "". Wygląda na to, że jestem najbliżej, chyba że uda mi się włamać do źródeł diffutils. – Eric

1

Można używać strumieni, aby uniknąć tworzenia tymczasowych plików i czyszczenia, składnia jest następująca:

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

W twoim przypadku:

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

nadzieję, że to pomaga.

+1

Dokładnie. Jak powiedział Kernighan w klasycznym * Narzędziach programistycznych *, przetwarzaj dane tak dokładnie, jak to możliwe, aby ostateczne zadanie było jak najprostsze. –

Powiązane problemy