linux-cli-shell automation bash scripting regex strings advanced

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 sed oder awk. 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]}