Seite 1 von 1

diff regex

Verfasst: 11.10.2011, 16:57
von BeRsErKeR
Ich habe schon einige Seiten durchstöbert und laut denen sollte der folgende Aufruf das gewünschte Resultat liefern. Allerdings tut er das nicht. Vielleicht hat von euch ja jemand Erfahrung mit diff.

Zunächst mal mein Ziel:

Ich prüfe zwei Dateien auf Gleichheit, allerdings sind diese Dateien generiert und enthalten eine Zeitangabe, wann sie erstellt wurden. Diese Zeitangabe möchte ich ignorieren, da nur wichtig ist ob der Inhalt der Datei gleich ist (unglücklicherweise ist dieser Zeitstring Teil des Inhalts).

Genauer ist dieser Zeitstring Teil eines C-Kommentares und sieht etwa wie folgt aus:

/**
* Tue Oct 11 16:09:34 2011 CEST
* ...
*/

Da die restlichen Teile des Kommentars stets identisch sind muss ich mich nur auf dieses Datum konzentrieren. Ich glaub es wird durch das Macro __DATE__ generiert, aber ist ja prinzipiell unwichtig.

diff hat laut manpage die Option -I RE, wobei RE einer Regular Expression entspricht. Diese Option ignoriert Zeilen bzw. Strings, die RE entsprechen.

Ich habe es nun wie folgt probiert:

Code: Alles auswählen

diff -I '^ [*] [[:alpha:]]{3} [[:alpha:]]{3} [[:digit:]]{1,2} [[:digit:]]{1,2}:[[:digit:]]{2}:[[:digit:]]{2} [[:digit:]]{4} [[:alpha:]]{4}' file.a file.b
Allerdings wird nach wie vor diese Zeile bemängelt.

Desweiteren habe ich [[:alpha:]] durch [a-zA-Z], [[:digit:]] durch [0-9] und [*] durch \* ersetz, jedoch ohne Erfolg. Auch habe ich die geschweiften Klammern wie {2} usw einfach durch ein + ersetzt. Auch das brachte nichts. Das Zeichen für den Zeilenanfang (^) hatte ich auch schon draußen und bei den Leerzeichen hatte ich einfach ein .* drin um ganz sicher zu gehen. Nichts hat geholfen. Soweit ich festgestellt habe (mit simpleren Beispielen) kommt diff mit Charakterklassen nicht klar, also z.B. [A-Za-z]+ oder [[:digit:]]. Laut unzähliger Seiten soll das aber ohne Probleme klappen. Daher die Frage wo hier mein Fehler liegt.

Ist ein kleines Problem, hält mich aber ziemlich auf. Muss nämlich eine automatisiertes Testcase-System für unseren Compiler bauen und da hab ich eigentlich nicht die Zeit mich mit sowas noch rumzuärgern. :(


Vielen Dank schonmal

Re: diff regex

Verfasst: 11.10.2011, 19:51
von BeRsErKeR
Hab das Problem erstmal dahingehend gelöst, indem der Compiler den Kommentar für Testcases nicht generiert.

Allerdings würde mich interessieren was da falsch läuft. Mit egrep geht's allerdings nutzt egrep soweit ich weiß auch PCRE und diff nutzt POSIX REs. Allerdings sollten Charakterklassen auch in POSIX REs möglich sein, laut Doku.

Re: diff regex

Verfasst: 11.10.2011, 20:38
von Sternmull
Also bei meinem GNU diff 3.2 steht garnicht erst dabei welcher Regex-Typ implementiert ist. Hier steht was von den üblichen GNU-Regex-Formaten. Dem folgend sollte sow was hier funktionieren:

Code: Alles auswählen

diff -I '^ \* [a-zA-Z]\{3\} [a-ZA-Z]\{3\} [0-9]\{2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\} [0-9]\{4\} CEST$' 1.txt 2.txt
Was es bei mir auch tut.

Ansonsten könnte man die Eingabedateien per

Code: Alles auswählen

egrep -vx '^ \* [[:alpha:]]{3} [[:alpha:]]{3} [[:digit:]]{1,2} [[:digit:]]{1,2}:[[:digit:]]{2}:[[:digit:]]{2} [[:digit:]]{4} [[:alpha:]]{4}$'
filtern um diff die ungeliebten Zeilen gleich komplett vorzuenthalten.

Re: diff regex

Verfasst: 12.10.2011, 12:03
von BeRsErKeR
Wieder was gelernt. Danke für die Hilfe. Mir war nicht bewusst, dass ich Operatoren wie '+' und '{}' escapen muss. Mit \+ geht es z.B. auch. Dennoch ziemlich verwirrend, da ich das '*' ja escape gerade damit ich das Zeichen und nicht den Operator referenziere.