Bash: String Manipulation & Regex (Artikel 249)
Beherrschung der Textverarbeitung in Bash. Erfahren Sie alles über Parameter Expansion zur Manipulation von Strings und den Einsatz von regulären Ausdrücken direkt in der Shell.
# Bash String Mastery: Manipulation ohne externe Tools
TL;DR / Management Summary Ein Senior Admin startet nicht für jede Kleinigkeit einen neuen Prozess wie
sedoderawk. Bash bietet mächtige eingebaute Funktionen für die Textverarbeitung: Parameter Expansion. Damit lassen sich Dateiendungen entfernen, Pfade extrahieren oder Suchen-und-Ersetzen Operationen direkt im Speicher der Shell durchführen. Zusammen mit dem nativen Regex-Operator (=~) wird Bash zu einem hocheffizienten Textprozessor.
# 1. Einführung & Architektur
Manipulation im RAM.
Der Hauptvorteil der internen Manipulation: Geschwindigkeit. Ein externer Aufruf von sed in einer Schleife über 10.000 Zeilen ist hunderte Male langsamer als native Bash-Funktionen.
# Die Werkzeug-Schichten (Mermaid)
graph TD
A[Raw Data String] --> B{Strategy}
B -->|Native & Fast| C[Parameter Expansion: ${VAR#...}]
B -->|Logic & Match| D[Regex Operator: =~]
B -->|Complex / External| E[Subprocess: sed / awk]
C/D --> F[Processed String]
E --> F
# 2. Parameter Expansion: Das Schweizer Taschenmesser
Strings biegen und brechen.
# 1. Abschneiden (Trimming)
${VAR#pattern}: Löscht das kleinste passende Muster am Anfang.${VAR##pattern}: Löscht das größte passende Muster am Anfang.${VAR%pattern}: Löscht am Ende (kleinstes).${VAR%%pattern}: Löscht am Ende (größtes).
FILE="/var/log/nginx/access.log"
echo "${FILE##*/}" # Output: access.log (Dateiname extrahieren)
echo "${FILE%/*}" # Output: /var/log/nginx (Pfad extrahieren)
# 2. Suchen und Ersetzen
${VAR/alt/neu}: Ersetzt das erste Vorkommen.${VAR//alt/neu}: Ersetzt alle Vorkommen.
STR="Ich liebe Debian. Debian ist toll."
echo "${STR//Debian/Arch}" # Output: Ich liebe Arch. Arch ist toll.
# 3. Native Reguläre Ausdrücke (=~)
Mustererkennung ohne grep.
Seit Bash 3.0 gibt es den Operator =~. Er nutzt ERE (Extended Regular Expressions).
# Beispiel: IP-Adresse validieren
IP="192.168.1.10"
REGEX="^([0-9]{1,3}\.){3}[0-9]{1,3}$"
if [[ $IP =~ $REGEX ]]; then
echo "Valid IP address"
else
echo "Invalid IP address"
fi
# 4. Day-2 Operations: Substrings & Case
Feinschliff.
# Substrings extrahieren
# ${VAR:start:länge}
ID="ABC-12345-XYZ"
echo "${ID:4:5}" # Output: 12345
# Groß-/Kleinschreibung ändern
VAR="enterprise"
echo "${VAR^^}" # Output: ENTERPRISE (Uppercase)
echo "${VAR^}" # Output: Enterprise (Capitalize)
# 5. Troubleshooting & “War Stories”
Wenn die Expansion schiefgeht.
# Story 1: “Der gierige Stern”
Symptom: ${VAR##*/} löscht den gesamten String, obwohl nur der Pfad weg sollte.
Ursache: Das Muster * in der Parameter Expansion ist “greedy” (gierig).
Lösung: Nutzen Sie die exakten Trennzeichen (wie /). Testen Sie Ihre Expansionen mit echo, bevor Sie sie in zerstörerische Befehle (rm) einbauen.
# Story 2: “Regex Capture Groups”
Symptom: Der Admin will den Hostnamen aus einer URL extrahieren, bekommt aber nur “Match” oder “No Match”.
Ursache: Unkenntnis des Arrays BASH_REMATCH.
Lösung: Wenn ein Regex passt, speichert Bash die Capture-Gruppen (Teile in Klammern) automatisch:
URL="https://archlinux.org/news/"
[[ $URL =~ https://([^/]+) ]]
echo "${BASH_REMATCH[1]}" # Output: archlinux.org
# 6. Fazit & Empfehlung
- Geschwindigkeit: Nutzen Sie Parameter Expansion für einfache Pfad- und Namensoperationen.
- Lesbarkeit: Halten Sie Regex in Skripten einfach. Wenn ein regulärer Ausdruck länger als eine Zeile wird, nutzen Sie ein separates Tool oder Python.
- Wahl: native Regex (
=~) sind ideal für Eingabevalidierungen in Skripten.
# Anhang: Cheatsheet
| Aufgabe | Syntax |
|---|---|
| Länge des Strings | ${#VAR} |
| Ersetzen (Erstes) | ${VAR/old/new} |
| Ersetzen (Alle) | ${VAR//old/new} |
| Anfang löschen (kurz) | ${VAR#pattern} |
| Anfang löschen (lang) | ${VAR##pattern} |
| Ende löschen (kurz) | ${VAR%pattern} |
| Ende löschen (lang) | ${VAR%%pattern} |
| Substring | ${VAR:offset:length} |
| Standardwert | ${VAR:-default} |
| Regex Match | [[ $VAR =~ $REGEX ]] |
| Regex Ergebnis | ${BASH_REMATCH[1]} |