Home / LinuxUser / 2001 / 06 / The Answer Girl

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

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

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.

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...