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.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • The Answer Girl
    Lauter kaputte Links in Webseiten, nur weil bei ihrer Erstellung Groß- und Kleinschreibung unbeachtet blieb? Dieses Problem lässt sich zum Beispiel mit einem Perl-Skript lösen.
  • Erste Schritte mit Bash-Skripten
    Das Programmieren von Shell-Skripten ist keine Hexerei. Schon mit wenigen Grundkenntnissen sparen Sie durch das Automatisieren alltäglicher Aufgaben viel Zeit.
  • Erste Schritte mit Regular Expressions
    Computer erleichtern die Arbeit – man muss ihnen nur genau sagen, was sie tun sollen. Mit regulären Ausdrücken beschleunigen Sie das Suchen und Ersetzen von Zeichenketten auf elegante Art.
  • Im Innern der Muschel
    Mit der Version 4 erhält die Bourne Again Shell (Bash) neue Funktionen, die sie einmal mehr als leistungsfähige Programmierschnittstelle zum System und zu Applikationen qualifiziert.
  • Seitenweise Informationen
    Der Pager Less zeigt schnell und zuverlässig Textdateien an. Wir zeigen, welche Features den Alltag noch ein Stückchen einfacher machen.
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: 172 Punkte bei 30 Stimmen.
Den Beitrag bewerten: Gut / Schlecht

Infos zur Publikation

LU 11/2014: VIDEOS BEARBEITEN

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Artikelsuche
Erwin Ruitenberg, 09.10.2014 07:51, 1 Antworten
Ich habe seit einige Jahre ein Dugisub LinuxUser. Dann weiß ich das irgendwann ein bestimmtes Art...
Windows 8 startet nur mit externer Festplatte
Anne La, 10.09.2014 17:25, 4 Antworten
Hallo Leute, also, ich bin auf folgendes Problem gestoßen: Ich habe Ubuntu 14.04 auf meiner...
Videoüberwachung mit Zoneminder
Heinz Becker, 10.08.2014 17:57, 0 Antworten
Hallo, ich habe den ZONEMINDER erfolgreich installiert. Das Bild erscheint jedoch nicht,...
internes Wlan und USB-Wlan-Srick
Gerhard Blobner, 04.08.2014 15:20, 2 Antworten
Hallo Linux-Forum: ich bin ein neuer Linux-User (ca. 25 Jahre Windows) und bin von WIN 8 auf Mint...
Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 1 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...