diff regex

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

diff regex

Beitrag 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
Ohne Input kein Output.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: diff regex

Beitrag 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.
Ohne Input kein Output.
Benutzeravatar
Sternmull
Establishment
Beiträge: 264
Registriert: 27.04.2007, 00:30
Echter Name: Til
Wohnort: Dresden

Re: diff regex

Beitrag 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.
Benutzeravatar
BeRsErKeR
Establishment
Beiträge: 689
Registriert: 27.04.2002, 22:01

Re: diff regex

Beitrag 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.
Ohne Input kein Output.
Antworten