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

KDE Plasma Workspaces 4.8
(306 Punkte bei 32 Stimmen)
SUSE12
(173 Punkte bei 4 Stimmen)
Pardus Linux am Ende?
(164 Punkte bei 4 Stimmen)
OpenSuse 12.1-Service Kit 01/12
(161 Punkte bei 4 Stimmen)
Meinst Du: Patch CD Updates?
(161 Punkte bei 4 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

2326 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

title_2012_02

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

Knoppix: Bootvorgang mit Cheatcode beschleunigen
Knoppix: Bootvorgang mit Cheatcode beschleunigen
Marcel Hilzinger, 18.01.2012 21:05, 0 Kommentare

Die Bootsequenz der Live-Distribution sucht beim Start zunächst auf Festplatten, dann auf USB-Sticks und erst dann in den DVD-Laufwerken (/dev/sr* oder /dev/scd*) nac...

Aktuelle Fragen

OpenSuse 12.1-Service Kit 01/12
Christoph-J. Walter, 28.01.2012 08:52, 2 Antworten
Hallo Gemeinde, ich habe 12.1 neu installiert. Alles in Ordnung! Nun möchte ich das Service Kit (...
Ubuntu 11.10 konfigurieren
Michael Hinz, 27.01.2012 17:52, 0 Antworten
Ubuntu läuft bei mir. Allerdings nur, wenn die Daten-CD eingelegt ist. Unabhängig von Bios-Einste...
SUSE12
Jörg Müller, 25.01.2012 14:27, 5 Antworten
Hallo Gemeinde Ich habe schon ziemlich lange auf einem Rechner Linux laufen, bin also nicht ganz...
Hat jemand Erfahrung beim Einsatz einer Kinect / OpenNI?
GoaSkin , 24.01.2012 23:35, 0 Antworten
Hallo, ich habe mir eine Kinect zugelegt, um zu schauen, was man damit unter Linux so machen k...
Kollaboration - Zeichnen auf mehreren Geräten gleichzeitig
Ludwig jun. B., 19.01.2012 11:17, 4 Antworten
Schönen guten Tag, ich suche aktuell eine Software für Linux/Windows (eines von beiden), welch...