Home / LinuxUser / 2001 / 02 / Teil 3: String-Verarbeitung und Reguläre Ausdrücke

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

Mandriva gibt Distribution in die Hände der Community
(271 Punkte bei 22 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Wortfetzen

Teil 3: String-Verarbeitung und Reguläre Ausdrücke

01.02.2001 Die Grundlagen der Zeichenketten haben wir in der letzten Ausgabe gelegt. Diesmal wollen wir uns aber nicht mit einfachen Leer-Tests oder Längenanzeigen begnügen, sondern unsere Strings kräftig durcheinander wirbeln.

Beginnen wollen wir mit der Abtrennung von Teilen eines Strings, sagen wir Hallo du schöne Welt. Auch wenn der eine oder andere diese Aussage nicht unbedingt unterschreiben möchte, wollen wir sie noch etwas verstärken. Dazu zerlegen wir unseren Satz erst einmal:

#!/bin/bash
 Satz="Hallo du schöne Welt"
 echo "${Satz:0:5} ${Satz:16}"

Das Ergebnis ist unser alt bekanntes "Hallo Welt", das wir mit dem Befehl "${variable:offset:länge}" aus unserem Satz herausgelöst haben. Dieser Befehl liefert einen Abschnitt (Substring) aus der angegebenen Zeichenkette.

Der Offset gibt an, wie viele Zeichen wir hinter dem Anfang beginnen. Bei "Hallo" geht es gleich beim ersten Zeichen los, also bei einem Offset von Null, während wir bis zum ersten Buchstaben von "Welt" 16 Zeichen überspringen müssen – daher haben wir hier einen Offset von 16. Wer mag, kann auch vom Ende eines Strings zurück zählen, wie im folgenden Beispiel:

#!/bin/bash
 Satz="Hallo du schöne Welt"
 echo "${Satz:0:5} ${Satz: -4}"

Immer, wenn Sie einen negativen Offset angeben, wird vom Ende nach vorn gezählt. Vorsicht aber mit Doppelpunkt und Minus: Wenn sie nicht mit einem Leerzeichen getrennt werden, erkennt Bash den Befehl "${variable:-string}", den wir in der letzten Folge der Programming Corner besprochen haben.

Im Beispiel haben wir die beiden Verwendungsformen der Teil-String-Funktion kennengelernt. Variable und Offset sind immer anzugeben; ohne Längenangabe wird der Substring ab der angegebenen Position bis zum Ende herausgelöst.

Mit diesem Wissen gelingt uns auch schon der Umbau:

#!/bin/bash
 Satz="Hallo du schöne Welt"
 echo "${Satz:0:5} ${Satz: -4}, ${Satz:6:2} bist so ${Satz:9:5}."

Ein großer Nachteil dieser Methode ist, dass wir immer die Position der Worte kennen müssen – würden wir statt "Hallo" "Hi" verwenden, käme unser ganzes Programm ins Schleudern. Eigentlich wollen wir ja Worte umstellen und nicht einfach Buchstaben, wir müssten also Wortgrenzen erkennen.

Zerlegung in Wörter

Dafür können wir die in der letzten Ausgabe besprochene Spezial-Variable IFS ausnutzen – in ihr stehen alle Zeichen, die als Trenner zwischen Programmnamen und Parametern gelten sollen. Standardmäßig sind das Leerzeichen, Tabulator und Enter. Für unsere Zwecke ist einzig das Leerzeichen der gewünschte Trenner zweier Worte. Das folgende Programm trennt unseren Satz anhand der Leerzeichen in Worte auf und speichert jedes Wort in einer anderen Variablen. Das Ergebnis ist dann das gleiche wie im vorhergehenden Listing, unser umgebauter Satz:

#!/bin/bash
 IFS=" "
 Satz="Hallo du schöne Welt"
 set – $Satz
 echo "$1 $4, $2 bist so ${3:0:5}."

Neu ist die vierte Zeile, der set-Befehl. Ohne Parameter angegeben listet er alle Variablen auf, die gesetzt sind. Ansonsten kann man mit set verschiedene Einstellungen zur Laufzeit der Bash verändern. Wir benutzen hier das dritte Anwendungsgebiet: Wir füllen unsere Parameter-Variablen (positional parameters), die wir sonst nicht verändern können, mit neuen Werten.

Wichtig ist das doppelte Minus-Zeichen als erster Parameter. set kennt eine Reihe von eigenen Optionen, die alle mit einem Minus-Zeichen gefolgt von einem Buchstaben beginnen. Das doppelte Minus ist als Ende-Zeichen aller Optionen definiert, das heißt, alles was danach steht, kann kein Parameter sein. In unserem Text eventuell auftauchende Minus-Zeichen werden also nicht fehlinterpretiert.

Über die Variable IFS haben wir set mitgeteilt, dass Parameter durch Leerzeichen getrennt werden. Somit ist für set jedes einzelne Wort ein Parameter; diese werden der Reihe nach in unseren Spezial-Variablen von $1 an aufsteigend abgelegt. Übrigens ist es nicht möglich, nur einzelne dieser Variablen zu füllen oder mit einer bestimmten Nummer anzufangen.

Arrays scheibchenweise

Jetzt können wir auch noch die andere Wirkung des Befehls ${variable:offset:länge} ausprobieren, nämlich im Zusammenhang mit Arrays. Hierzu verwenden wir das Array $*, das alle Parameter-Variablen wie $0, $1 und $2 enthält:

#!/bin/bash
 set – Hallo Welt - du bist so schön.
 echo ${*:1:2}

Das Ergebnis ist unser altbekanntes "Hallo Welt". In Verwendung mit Arrays bekommen wir eine Teilmenge der Elemente anstatt wie bei Zeichenketten einen Teil der Buchstaben. Im Beispiel fangen wir bei Element Nummer 1 an und lassen uns insgesamt zwei Elemente herausfischen. Arrays fangen normal bei Element 0 an. In $0 steht jedoch der Programmname der Bash, deshalb finden wir das erste Element der Parameter-Variablen ausnahmsweise bei $1.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare
Grober Unfug
besserwisser (unangemeldet), Sonntag, 04. März 2012 22:01:22
Ein/Ausklappen

Leider kann bash genau das nicht.
Shells verwenden normal sog. Wildcards (wie in der Kommandozeile)
und keine richtigen Regulärausdrücke.
zb. ist "*" innerhalb eines solchen Konstrukts mit ".*" gleichzusetzen
weshalb die Verfielfachung "x*" (wobei x beliebig ist) ganau nicht mehr funktioniert (auch ".*" da ja "." immer als Zeichen betrachtet wird, im echten RE wäre das nur mit Maskierung "\." möglich).

Grund: Diese Funktionen sind gedacht um Pfade und Dateinamen zu behandeln und verarbeiten nur Präfix und Suffix, daher auch die Anwendung mit Vorwärts- und Rückwärtssuche (# und %) bzw. mit der eigenschaft gierig und genügsam (##,%% und #,%).
Siehe bash manpage unter "Parameter Expansion", das sagt eigentlich schon alles.

Wer es nicht glaubt, bzw zur Übersicht:
http://www.lrz.de/services/schulung/unterlagen/regul/#meta


Bewertung: Noch keine Bewertung abgegeben!
Den Beitrag bewerten: Gut / Schlecht

2661 Hits
Wertung: 69 Punkte (1 Stimme)

Schlecht Gut

Infos zum Autor

Mirko Dölle

Redakteur für Linux bei c't, Heise Zeitschriften Verlag; ehemals Competence Center Hardware/Linux-Magazin, Linux New Media AG


Infos zur Publikation

Infos zur Publikation

LinuxUser 06/2012

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 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 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Adobe AIR
Adobe-AIR-Programme installieren und (manuell) starten
Tim Schürmann, 14.05.2012 13:09, 0 Kommentare

Es gibt sie noch: neue Anwendungen, die Adobes Integrated Runtime voraussetzen. Aktuellstes und vermutlich auch größtes Beispiel ist das Adventure Botanicula

Aktuelle Fragen

gibt es ein Kommandozeilen Tool, um ein X11-Fenster in ein Anderes einzubetten?
GoaSkin , 21.05.2012 16:44, 0 Antworten
Das XEmbed-Protokoll ist u.A. dazu gedacht, dass man eine X11-Anwendung in eine andere wie ein Wi...
Apache2, Options -Indexes geht nicht
no no, 12.05.2012 19:01, 8 Antworten
Habe in apache2.conf folgendes stehen: Options -Indexes ...
LInux auf Dell LS H500
Andreas Endresl, 09.05.2012 08:54, 2 Antworten
Habe einen alten Dell Latitude LS H500 nur mit ext. Floppy und CD es geht nur immer eines von den...
Datenwiederherstellung unter Ubuntu 12.04 mit "Simple Backup" nach Umzug von Linux Mint
Christian Lottmann, 07.05.2012 13:33, 0 Antworten
Vor dem Umzug auf Ubuntu 12.04 habe ich unter Linux MInt mit "Simple Backup" voll (15.4.2012) und...
DKMS für den propritären NVIDIA-Treiber
Commander Data, 26.04.2012 22:02, 2 Antworten
Hallo an die Gemeinde. Ich habe hier ein interessantes Stück openSuSE gefunden. http://forums.op...