Vorverarbeitungsbefehle

KDiff3 unterstützt zwei Vorverarbeitungsbefehle.

Vorverarbeitungsbefehl:

Beim Lesen einer Datei wird sie zuerst diesem externen Befehl übergeben. In KDiff3 wird dann die Ausgabe des Befehls sichtbar, und nicht die Datei selbst. Sie können Ihren eigenen Vorverarbeitungsbefehle schreiben, die genau Ihre Ansprüchen erfüllen. Sie können diese Funktion z. B. zum Herausschneiden störender Teile oder zum Korrigieren der Einrückung verwenden.

Vorverarbeitungsbefehl nur für Zeilenabgleich:

Beim Lesen einer Datei wird sie zuerst diesem externen Befehl übergeben. Wenn auch ein normaler Vorverarbeitungsbefehl angegeben wurde (siehe oben), dann ist die Ausgabe des Befehls die Eingabe dieses Vorverarbeitungsbefehls. Die Ausgabe des Befehls wird nur beim Zeilenabgleich verwendet. Sie können Ihre eigenen Vorverarbeitungsbefehle schreiben, der genau Ihre Ansprüchen erfüllen. Jede Eingabe-Zeile muss eine zugehörige Ausgabe-Zeile haben.

Der Gedanke dahinter ist, dem Anwender mehr Flexibilität beim Einrichten der Diff-Ergebnisse zu ermöglichen. Doch dafür wird ein externes Programm benötigt, und die meisten Anwender möchten das nicht selbst programmieren. Die Gute Nachricht ist allerdings, dass in dem meisten Fällen sed oder perl vollkommen ausreichen.

Beispiel: Ein einfacher Testfall. Wir nehmen eine Datei a.txt (6 Zeilen):

aa
      ba
      ca
      da
      ea
      fa

Und Datei b.txt (3 Zeilen):

cg
      dg
      eg

Ohne Vorverarbeitung würden die folgenden Zeilen nebeneinander stehen:

aa - cg
      ba - dg
      ca - eg
      da
      ea
      fa

Dies ist allerdings nicht das gewünschte Ergebnis, weil der erste Buchstabe die interessante Information darstellt. Um den Suchalgorithmus beim Abgleich zu unterstützen, ignorieren wir den zweiten Buchstaben. Dazu kann folgende Zeilen-Vorverarbeitung verwendet werden, der g durch a ersetzt:

sed 's/g/a/'

Mit diesem Befehl würde das Ergebnis des Vergleichs so aussehen:

aa
      ba
      ca - cg
      da - dg
      ea - eg
      fa

Programmintern sieht der Vergleichsalgorythmus die Dateien erst nach dem Durchlauf de Zeilen-Vorverarbeitung, auf dem Vorverarbeitung würde auch die Daten auf dem Bildschirm ändern.)

sed-Grundlagen

Dieser Abschnitt führt Sie nur in einige sehr grundlegende Funktionen von sed ein. Weiterführende Informationen finden Sie unter info:/sed oder https://www.gnu.org/software/sed/manual/html_mono/sed.html. Eine vorkompilierte Version für Windows® finden Sie unter http://unxutils.sourceforge.net. Beachten Sie, dass die folgenden Beispiele voraussetzen, dass der Befehl sed sich in einem Ordner in der PATH-Variable befindet. Falls das nicht der Fall sein sollte, müssen Sie den vollständigen Pfad zu sed angeben.

In diesem Kontext wird nur der sed-Ersetzungs-Befehl benutzt:

sed 's/REGEXP/REPLACEMENT/FLAGS'

Bevor Sie in KDiff3 einen neuen Befehl benutzen, sollten Sie ihn zuerst in der Konsole testen. Hier kann der echo-Befehl sehr hilfreich sein. Beispiel:

echo abrakadabra | sed 's/a/o/'
   -> obrakadabra

Dieses Beispiel zeigt einen einfachen sed-Befehl, der das erste Vorkommen von a durch o ersetzt. Wenn Sie alle Vorkommen ersetzen möchten, müssen Sie den Schalter g benutzen:

echo abrakadabra | sed 's/a/o/g'
   -> obrokodobro

Das |-Symbol ist der Pipe-Befehl, er übergibt die Ausgabe des ersten Befehls an die Eingabe des folgenden Befehls. Wenn Sie Ihren sed-Befehl mit einer längeren Datei testen möchten, dann können Sie unter UNIX® cat und unter Windows® type dazu benutzen. sed wird die Ersetzung in jeder Zeile der Datei durchführen.

cat dateiname | sed optionen

Beispielanwendungen von sed in KDiff3

Ignorieren weiterer Kommentartypen

Zurzeit unterstützt KDiff3 nur C/C++-Kommentare. Mit Hilfe von Vorverarbeitungsbefehl nur für Zeilenabgleich können Sie andere Kommentar-Arten ignorieren. Dafür wandeln Sie diese in C/C++-Kommentare um.

Beispiel: Um Kommentare zu ignorieren, die mit # beginnen, würden Sie diese zu // umwandeln. Außerdem muss natürlich die Option C/C++-Kommentare ignorieren, wie Leerräume behandeln aktiviert sein, damit dies etwas bewirkt. Ein passender Befehl für den Vorverarbeitungsbefehl nur für Zeilenabgleich wäre zum Beispiel:

sed 's/#/\/\//'

Weil das Zeichen / für sed ein Sonderzeichen ist, muss jedem / ein \ vorangestellt werden. Manchmal wird dies benötigt, um einem Sonderzeichen die besondere Bedeutung zu entziehen. Die einfachen Anführungszeichen (') sind nur beim Testen auf der Befehlszeile wichtig, weil die Shell sonst versucht, einige Zeichen zu verarbeiten. In KDiff3 werden nur die Escape-Sequenzen wie' \"' und '\\' verarbeitet.

Diff ohne Beachtung der Groß-/ Kleinschreibung

Verwenden Sie diesen Vorverarbeitungsbefehl für Zeilenabgleich um die Eingabe in Großbuchstaben umzuwandeln:

sed 's/\(.*\)/\U\1/'

Das .* ist ein regulärer Ausdruck, der auf jede Zeichenfolge passt und in diesem Zusammenhang daher alle Zeichen in einer Zeile erfasst. Das \1 in der Ersetzungs-Zeichenfolge bezieht sich auf den gefundenen Text im ersten Klammerpaar. Das \U wandelt den gefundenen Text in Großbuchstaben um.

Ignorieren von Schlüsselwörtern aus Versionskontrolle-Systemen

CVS und andere Versionskontrolle-Systeme verwenden einige Schlüsselwörter, um automatisch erzeugte Zeichenfolgen einzufügen (info:/cvs/Keyword substitution). Alle folgen demselben Muster $SCHLÜSSELWORT erzeugter Text$. Nun wird also ein Vorverarbeitungsbefehl für Zeilenabgleich benötigt, der den automatisch erzeugten Text entfernt:

sed 's/\$\(Revision\|Author\|Log\|Header\|Date\).*\$/\$\1\$/'

Das \| trennt die möglichen Schlüsselwörter. Sie können die Liste nach Bedarf ändern. Das \ vor dem $ ist nötig, weil $ ein Sonderzeichen ist und Ende der Zeile bedeuten würde.

Während Sie mit sed experimentieren, beginnen Sie vielleicht, es zu verstehen und vielleicht mögen Sie diese regulären Ausdrücke sogar. Sie sind sehr nützlich weil es viele Programme gibt, die sehr ähnliche Dinge unterstützen.

Ignorieren von Zahlen

Das Ignorieren von Zahlen ist eigentlich eine bereits eingebaute Funktion. Aber sie ist gut als Beispiel für einen weiteren Vorverarbeitungsbefehl für Zeilenabgleich geeignet.

sed 's/[0123456789.-]//g'

Jedes Zeichen zwischen '[' und ']' ist eine Übereinstimmung, und jede Übereinstimmung wird durch nichts ersetzt, also quasi gelöscht.

Ignorieren von bestimmten Spalten

Manchmal ist ein Text nach strengen Regeln formatiert und enthält Spalten, die Sie grundsätzlich ignorieren möchten, und andere Spalten, die Sie für die Analyse heranziehen möchten. Im folgenden Beispiel werden die ersten fünf Spalten (Zeichen) ignoriert, dann 10 Spalten beibehalten, dann wieder fünf Spalten ignoriert und der Rest der Zeile wird beibehalten.

sed 's/.....\(..........\).....\(.*\)/\1\2/'

Jeder Punkt '.' passt auf genau ein Zeichen. Die \1 und \2 in der Ersetzungs-Zeichenfolge beziehen sich auf den gefundenen Text im ersten und zweiten Klammerpaar und markieren so den beizubehaltenden Text.

Mehrere Ersetzungen kombinieren

Manchmal möchten Sie vielleicht mehrere Ersetzungen auf einmal durchführen. Dann können Sie das Semikolon ; benutzen, um die Ersetzungen voneinander zu trennen. Beispiel:

echo abrakadabra | sed 's/a/o/g;s/\(.*\)/\U\1/'
   -> OBROKODOBRO

perl statt sed benutzen

Statt sed können Sie auch etwas anderes wie z. B. perl verwenden.

perl -p -e 's/REGEXP/REPLACEMENT/FLAGS'

Allerdings sind bei perl einige Details anders. Wo sed \( und \) benötigt, braucht perl nur noch ( und ) ohne das vorangestellte \. Beispiel:

sed 's/\(.*\)/\U\1/'
   perl -p -e 's/(.*)/\U\1/'

Reihenfolge der Ausführung von Vorverarbeitungsbefehlen

Die Daten werden durch interne und externe Vorverarbeitungsbefehle in dieser Reihenfolge durchgeschleust:

  • Normale Vorverarbeitungsbefehle,

  • Vorverarbeitungsbefehl für Zeilenabgleich,

  • Groß-/Kleinschreibung ignorieren, wie Leerräume behandeln (Umwandlung in Großbuchstaben),

  • Erkennung von C/C++ Kommentaren,

  • Zahlen ignorieren, wie Leerräume behandeln,

  • Leerräume ignorieren

Die Daten nach der normalen Vorverarbeitung werden für die Anzeige und zum Zusammenführen beibehalten. Die weiteren Operationen verändern nur die Daten, die der Zeilenabgleich-Algorithmus sieht.

Beachten Sie: In seltenen Fällen wenn Sie einen normalen Vorverarbeitungsbefehlverwenden, sieht der Zeilenabgleich-Vorverarbeitung die Ausgabe der normalen Vorverarbeitung als Eingabe.

Warnung

Die Vorverarbeitungsbefehle sind sehr nützlich, aber wie bei jeder Funktion, die Text verändert oder Unterschiede ausblendet, können Sie versehentlich bestimmte Unterschiede nicht bemerken und im schlimmsten Fall wichtige Daten zerstören.

Beim Zusammenführen werden Sie daher von KDiff3 gewarnt, falls ein Vorverarbeitungsbefehl benutzt wurde. Sie werden gefragt, ob dieser deaktiviert werden soll oder nicht. Sie werden allerdings nicht gewarnt, wenn ein Vorverarbeitungsbefehl für den Zeilenabgleich benutzt wird. Das Zusammenführen ist nicht abgeschlossen bevor nicht alle Konflikte aufgelöst wurden. Falls Sie UnterschiedsansichtLeerräume anzeigen deaktivihaben, dann sind die vom Vorverarbeitungsbefehl nur für Zeilenabgleich entfernten Unterschiede ebenfalls unsichtbar. Wenn der Knopf Speichern während des Zusammenführens deaktiviert bleibt (durch nicht aufgelöste Konflikte), dann aktivieren Sie UnterschiedsansichtLeerräume anzeigen. Falls diese weniger wichtigen Unterschiede nicht zusammengeführt werden sollen, können Sie auch ZusammenführenFür alle ungelösten Leerraum-Konflikte A/B/C wählen im Menü auswählen.