Bitte übersetzen Sie!
The Answer Girl
Ohne Doppelgänger
Diese Ausgabe zeigt deutlich, dass wir mit dem Skript noch etwas vorhaben: Wir wollen die Dubletten loswerden. Eigentlich eine einfache Sache: die Ausgabe mit sort sortieren (dank -f – "fold" – mit gleicher Wertigkeit für Groß- und Kleinbuchstaben) und mit uniq die Doppelgänger rauswerfen:
grep -hwi "$1" $WBDIR/* | sort -f | uniq
Leider stimmt damit irgendwas nicht, denn der Testlauf ergibt
[trish@lillegroenn /tmp]$ ./wb yesterday […] gestern – yesterday only yesterday – erst gestern vorgestern – the day before yesterday yesterday – gestern yesterday – gestern […]
zwar ein sortiertes, aber immer noch nicht dublettenfreies Bild. Die Untersuchung der mit ./wb yesterday > /tmp/test in die Datei /tmp/test umgeleitete Ausgabe mit einem Editor ergibt: Der einzige Unterschied zwischen den zwei "yesterday – gestern"-Zeilen sind Whitespace-Zeichen.
Na gut, dann vereinheitlichen wir all diese ('[:blank:]') zunächst zu Leerzeichen (' ') und vereinfachen alle Leerzeichenfolgen mit der tr-Option -s (squeeze") jeweils zu einem einzelnen:
grep -hwi "$1" $WBDIR/* | tr -s '[:blank:]' ' ' | sort -f | uniq
Und doch – immer noch zeigt sich die Doppelzeile hartnäckig: Natürlich, denn jetzt haben wir in der einen Ausgabe kein und in der anderen genau ein Leerzeichen am Zeilenende, an dem sich uniq stört.
Also holen wir seufzend nochmal sed heraus und ersetzen ein einzelnes Leerzeichen am Zeilenende ($) durch nichts:
grep -hwi "$1" $WBDIR/* | tr -s '[:blank:]' ' ' | sed -e "s/ $//" | sort -f | uniq
Et voilà – endlich ist das wb-Skript (Listing 1) funktionstüchtig. Jetzt dürfen die Debug-Optionen weg, und root kann es nach /usr/local/bin zur Nutzung für alle kopieren. Da dieses Verzeichnis meistens in der PATH-Variablen enthalten ist, reicht es jetzt auch, wb ohne Pfadangabe aufzurufen.
Listing 1
Das Wörterbuchskript
wb #!/bin/bash
WBDIR=/home/trish/dict
if [ $# -ne 1 ]; then
echo "Usage: $0 \"string string …\""
echo " $0 string"
echo " $0 regexp"
else
grep -hwi "$1" $WBDIR/* | tr -s '[:blank:]' ' ' | sed -e "s/ $//" | sort -f | uniq
fi
Mehrwert
Aufmerksame Leser/innen wundern sich möglicherweise, dass in Listing 1 aus einer vorgestellten plötzlich drei echo-Zeilen wurden. Wer ein wenig mit dem Skript (oder grep) experimentiert hat, weiß, dass man der Shell durch Einschließen mehrerer Strings in Anführungszeichen suggerieren kann, dass sie es trotz allem nur mit einem Argument zu tun hat.
Sobald Benutzer/innen nach einem Ausdruck suchen wollen, der aus mehreren Wörtern besteht, müssen sie den einfach in Gänsefüßchen setzen:
[trish@lillegroenn /tmp]$ wb "sich erinnern" recollect – sich erinnern an remember – sich erinnern sich erinnern – remember[…]
Diese Benutzungsart sollten wir natürlich dokumentieren:
echo "Usage: $0 \"string string …\""
Damit echo die auszugebenden Hochkommata nicht fälschlicherweise für die Begrenzung des eigenen Arguments hält, müssen sie mit \ escapt (d. h., ihrer Sonderstellung in der Shell beraubt) werden.
Die letzte echo-Zeile
echo " $0 regexp"
hingegen zielt darauf ab, dass grep von Haus aus nicht nur nach Zeichenketten, sondern auch nach regulären Ausdrücken ("regexps") sucht. Damit kann die Nutzerin zum Beispiel Schreibunsicherheiten elegant überspielen:
[trish@lillegroenn /tmp]$ wb "ye.*y" erst gestern – only yesterday Freibauern – yeomanry gelbliche – yellowly gestern – yesterday hefig – yeasty[…]
sucht nach der Übersetzung von Wörtern, die mit ye beginnen und auf y enden. Der Punkt steht dabei für ein beliebiges Zeichen, und der nachgestellte * signalisiert, dass eine beliebige Anzahl (mindestens keins) davon auftauchen soll.
Zu beachten ist hier lediglich, dass auch bei regulären Ausdrücken der Satz gilt: "Manche sind gleicher als andere." Obwohl die Grundregeln gleich sind, sind z. B. nicht alle perl-Regexps auch mit grep zu gebrauchen. Ein Blick in die grep-Manpage ist daher oft von Vorteil …
Glossar
Leserechte
Damit der Inhalt einer Datei mit Hilfe eines Pagers wie less oder eines Editors den Augen eines Users zugänglich gemacht werden kann, muss sie aus Sicht dieses Benutzers das r- ("read"-) Flag tragen. Dies kann mit dem Kommando chmod für die Eigentümerin der Datei (chmod u+r dateiname), die Eigentümergruppe (g+r) und alle anderen (o+r) gesetzt werden. Bei Verzeichnissen lässt das Leserecht die Anzeige des Verzeichnisinhalts mit ls zu. Weitere Rechte sind das Schreib- (w) und das Ausführungsrecht (x). Sie können mit ls -l ("long listing") sichtbar gemacht werden.
Pipe
Die "Rohrleitung", auf der Kommandozeile | geschrieben, nimmt die Standardausgabe des links davon stehenden Kommandos und füttert damit das Kommando auf der rechten Seite.
Shell
Die Kommandozeilenschnittstelle zwischen der Benutzerin und ihren Eingabegeräten und dem Betriebssystem. Die meisten Unix-Shells haben eine mehr oder weniger mächtige Programmiersprache eingebaut.
$
Shells wie die Bourne-Shell (sh), Korn-Shell (ksh) oder die Bourne-Again-Shell (bash, unter Linux auch sh) geben den Inhalt einer Variablen preis, wenn man vor ihren Namen ein Dollarzeichen setzt.
Whitespace
Sammelbegriff für Zeichen, die dem Auge "Hier steht kein Zeichen" vorgaukeln. Darunter fallen z. B. Leer- und Tabulatorzeichen.



