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.
0Doch 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
5kommen 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



