Home / LinuxUser / 2001 / 06 / The Answer Girl

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Eingedost
(161 Punkte bei 4 Stimmen)
Aufteiler
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.

Bitte übersetzen Sie!

The Answer Girl

Gleichmacherei

eng2ger.vok trennt die deutschen Vokabeln durch zwei Bindestriche und jeweils ein Leerzeichen davor und danach von ihren englischen Übersetzungen:

erst gestern – only yesterday

Da diese Datei bei Weitem die größte ist, bietet es sich an, ihre Konvention auf die anderen Files zu übertragen.

Bei EXERCISE.VOK ist das nicht so schwer: Diese Datei belässt es bei einem Strich (-) zwischen den Leerzeichen, den wir mit sed schnell ersetzen:

[trish@lillegroenn eng_deu]$ sed -e "s/ - / – /" EXERCISE.VOK > EXERCISE.VOK_ 

Der sed-Befehl s substituiert schlicht und einfach das erste Vorkommnis von LeerzeichenMinusLeerzeichen in jeder Zeile mit LeerzeichenMinusMinusLeerzeichen. Das Ergebnis dieses Befehls, angewendet auf EXERCISE.VOK, erhalten wir eigentlich auf der Standardausgabe. Doch da wir es lieber in einer Datei sehen, leite wir mit > die Ausgabe in die Datei EXERCISE.VOK_ um. Nachdem wir uns vergewissert haben, dass die neue Datei vernünftig aussieht, reicht ein

[trish@lillegroenn eng_deu]$ mv EXERCISE.VOK_ EXERCISE.VOK

um die alte mit der neuen Datei zu überschreiben.

Die Datei BOOK.VOK stellt schon höhere Ansprüche: Hier dient ein einfaches Leerzeichen als Trennzeichen:

yesterday gestern

Damit es keine Verwechslungen mit Wortzwischenräumen in Wendungen gibt, sind diese durch einen Unterstrich gekennzeichnet, der als Wortbestandteil glücklicherweise nicht vorkommt:

yearn sich_sehnen

Hier müssen wir also zweimal ersetzen: das jeweils erste Leerzeichen durch LeerzeichenMinusLeerzeichen (s/ / -- /) und global jegliches Vorkommen von _ durch Leerzeichen (s/_/ /g). Kombiniert sieht das so aus:

[trish@lillegroenn eng_deu]$ sed -e "s/ / – /" -e "s/_/ /g" BOOK.VOK > BOOK.VOK_

Prüfen und Vergleichen

Bevor wir BOOK.VOK mit BOOK.VOK_ überschreiben, möchten wir die neue Datei prüfen, also mit dem Original vergleichen. Doch diff eignet sich hierfür nicht, da es alle Zeilen ausgibt, die verschieden sind, und das sind nunmal alle… Was wir brauchen, ist ein wortbasiertes diff: wdiff. Wenn's die Distribution nicht mitliefert, ist es z. B. unter http://rpmfind.net/linux/rpm2html/search.php?query=wdiff oder http://packages.debian.org/stable/text/wdiff.html erhältlich.

[trish@lillegroenn eng_deu]$ wdiff --help
 Usage: wdiff [OPTION]… FILE1 FILE2[…]
   -3, --no-common      inhibit output of common words

Mit der Option -3 lässt sich also vermeiden, dass wdiff Wörter ausgibt, die gleich geblieben sind. Wenn wir die ganze Ausgabe noch durch less schicken, verhindern wir auch, dass uns beim Durchschauen etwas durch die Lappen geht:

[trish@lillegroenn eng_deu]$ wdiff -3 BOOK.VOK BOOK.VOK_ | less[…]
 =========================================
  {+--+}
 =========================================
  [-du_kannst-] {+-- du kannst+}[…]

wdiffs Ausgabe ist zugegebenermaßen etwas gewöhnungsbedürftig: Die =-Zeile fungiert lediglich als Trennzeile. In [- -] stehen Strings aus BOOK.VOK, die in BOOK.VOK_ durch die Zeichenkette in der {+-Klammer ersetzt wurden. Das {+--+} bedeutet, dass in BOOK.VOK_ einfach zwei Minuszeichen hinzugekommen sind – Leerzeichen sind für das wortbasierte diff vernachlässigbar.

Besser lesbar wird die Ausgabe im sogenannten less-Modus, der mit less eigentlich nicht viel zu tun hat. Aber immerhin,

[trish@lillegroenn eng_deu]$ wdiff -3l BOOK.VOK BOOK.VOK_ | less[…]
 =========================================
  –
 =========================================
  du_kannst – du kannst[…]

verzichtet auf die ungewohnte Klammerung und macht die Ausgabe daher leichter lesbar.

Allerdings haben wir keine Lust, durch die gesamte less-Ausgabe zu gehen, und überlegen uns Folgendes: Wenn wir alles richtig gemacht haben, wirft wdiff -3 genausoviele ---Zeilen aus, wie BOOK.VOK (und BOOK.VOK_) Zeilen (lines – -l) hat:

[trish@lillegroenn eng_deu]$ wc -l BOOK.VOK BOOK.VOK_
   29018 BOOK.VOK
   29018 BOOK.VOK_
   58036 total

Wenn wir aus der wdiff-Ausgabe alle störenden Trennzeilen heraus filtern, sollten wir eigentlich ebenfalls auf 29018 Zeilen kommen (grep -v sucht all die Zeilen heraus, die kein == enthalten):

[trish@lillegroenn eng_deu]$ wdiff -3l BOOK.VOK BOOK.VOK_ |grep -v "=="| wc -l
   29023

So ganz wie geplant lief das also nicht – wo kommen die fünf Zeilen zuviel her? Clever, wie wir sind, lassen wir uns einfach all die Zeilen anzeigen, die kein Doppelminus enthalten:

[trish@lillegroenn eng_deu]$ wdiff -3l BOOK.VOK BOOK.VOK_ | grep -v "==" | grep -v "--"| wc -l
 Usage: grep [OPTION]… PATTERN [FILE]…
 Try `grep --help' for more information.
       0

Doch da haben wir wohl was falsch gemacht… Natürlich: Minus-Zeichen dienen ja als Kennzeichen für die Shell, dass dahinter eine Option kommt, und die Stärke der doppelten Anführungszeichen reicht nicht aus, um unser Minus-Suchmuster vor der Shell zu verbergen.

Zum Glück erinnern wir uns an den alten Bash-Trick, einem Befehl mit einem -- zu sagen, dass dahinter keine weiteren Optionen kommen:

[trish@lillegroenn eng_deu]$ man bash[…]
 OPTIONS[…]
    -  A single - signals the end of options and disables fur­
       ther  option processing.  Any arguments after the - are
       treated as filenames and arguments.  An argument of  –
       is equivalent to an argument of -.[…]

Mit einem

[trish@lillegroenn eng_deu]$ wdiff -3l BOOK.VOK BOOK.VOK_ | grep -v "==" | grep -v – "--"| wc -l
       5

kommen wir also tatsächlich auf die vermissten fünf Zeilen. Doch wo kommen die her?

[trish@lillegroenn eng_deu]$ wdiff -3l BOOK.VOK BOOK.VOK_ | grep -v "==" | grep -v – "--"
 arrow_keys
 sensing_mark

Drei Leerzeilen, die wdiff irgendwie eingebaut hat, aber was ist mit arrow_keys und sensing_mark? Derselbe Befehl ohne die l-Option für wdiff gibt Auskunft, und

[trish@lillegroenn eng_deu]$ wdiff -3l BOOK.VOK BOOK.VOK_ | less

lässt uns mit dem less-Befehl /arrow_keys nach der entsprechenden Stelle im Vergleich fahnden. Siehe da:

 [-arrow_keys-]
 {+arrow keys --+}

Schuld (auch an den Leerzeilen) trägt eindeutig wdiff.

Bei all dem Hin und Her hätten wir beinahe vergessen, warum wir wdiff überhaupt rausgekramt haben: Wir wollten prüfen, ob in den Zeilen, in denen wir Unterstriche ersetzt haben, alles glatt gegangen ist. Da nehmen wir lieber wdiff ohne die l-Option her, denn da können wir alle Zeilen ausschließen, in denen ein {+--+} vorkommt:

[trish@lillegroenn eng_deu]$ wdiff -3 BOOK.VOK BOOK.VOK_ | grep -v "==" | grep -v "{+--+}" | less

Alles in Ordnung? Dann überschreiben wir einfach das alte BOOK.VOK mit dem konvertierten Inhalt aus BOOK.VOK_:

[trish@lillegroenn eng_deu]$ mv BOOK.VOK_ BOOK.VOK 
Tip a friend    Druckansicht Bookmark and Share
Kommentare

Hits
Wertung: 130 Punkte (6 Stimmen)

Schlecht Gut

Infos zur Publikation

Infos zur Publikation

LinuxUser 05/2014

Aktuelle Ausgabe kaufen:

Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,95 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 60,60) können Sie im Medialinx-Shop bestellen.

Tipp der Woche

Bilder vergleichen mit diffimg
Bilder vergleichen mit diffimg
Tim Schürmann, 01.04.2014 12:40, 1 Kommentare

Das kleine Werkzeug diffimg kann zwei (scheinbar) identische Bilder miteinander vergleichen und die Unterschiede optisch hervorheben. Damit lassen sich nicht nur Rätsel a la „Orignial und Fäls...

Aktuelle Fragen

programm suche
Hans-Joachim Köpke, 13.04.2014 10:43, 8 Antworten
suche noch programme die zu windows gibt, die auch unter linux laufen bzw sich ähneln sozusagen a...
Funknetz (Web-Stick)
Hans-Joachim Köpke, 04.04.2014 07:31, 2 Antworten
Bei Windows7 brauche ich den Stick nur ins USB-Fach schieben dann erkennt Windows7 Automatisch, a...
Ubuntu 13.10 überschreibt immer Windows 8 Bootmanager
Thomas Weiss, 15.03.2014 19:20, 8 Antworten
Hallo Leute, ich hoffe das ich richtig bin. Ich habe einen Dell Insipron 660 Ich möchte gerne Ub...
USB-PTP-Class Kamera wird nicht erkannt (Windows-only)
Wimpy *, 14.03.2014 13:04, 15 Antworten
ich habe meiner Frau eine Digitalkamera, AGFA Optima 103, gekauft und wir sind sehr zufrieden dam...
Treiber
Michael Kristahn, 12.03.2014 08:28, 5 Antworten
Habe mir ein Scanner gebraucht gekauft von Canon CanoScan LiDE 70 kein Treiber wie bekomme ich de...