Intelligente Lösungen
in neuer Dimension

Linux - Suchen und Ersetzen

Suchen und Ersetzen via Linux-Kommandozeile ist einfach: Einfach ein Kommando wie:

  • sed -i -e "s/(suchstring)/(ersetzstring)/" "(dateiname)"

absetzen und schon klappt es. Etwas kompliziert wird es, wenn die Zeichenketten (strings) variabel sind und potentiell Steuerzeichen oder einfache Schrägstriche enthalten. Dann scheitert das Kommando!

Einfacher Test

Hier ein ganz einfacher Test, alls klappt wie gewünscht:

1
2
3
4
5
6
7
8
9
10
SEARCH=uli
REPLACE=heller

(
cat <<EOF
uli war da
EOF
)|sed -e "s/${SEARCH}/${REPLACE}/"

# liefert: heller war da

KO-Test

Probleme treten auf, wenn Punkte im Suchmuster sind. Diese werden als Teil einer Regex interpretiert. Dadurch wird dann auch “uli” und “uwe” ersetzt:

1
2
3
4
5
6
7
8
9
10
11
12
SEARCH=u..
REPLACE=heller

(
cat <<EOF
uli war da
uwe war da
u.. war da
EOF
)|sed -e "s/${SEARCH}/${REPLACE}/"

# liefert 3x: heller war da

Eigentlich hätte ich als Ergebnis gerne:

1
2
3
uli war da
uwe war da
heller war da

Maskieren der Zeichenketten

Wenn die Zeichenketten maskiert werden, dann klappt es:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SEARCH=u..
REPLACE=heller
SEARCH_ESCAPED="$(echo "${SEARCH}"  |sed -e 's/[]\/()$*.^|[]/\\&/g')"
REPLACE_ESCAPED="$(echo "${REPLACE}"|sed -e 's/[]\/()$*.^|[]/\\&/g')"

(
cat <<EOF
uli war da
uwe war da
u.. war da
EOF
)|sed -e "s/${SEARCH_ESCAPED}/${REPLACE_ESCAPED}/"

# liefert:
#  uli war da
#  uwe war da
#  heller war da

Links

Historie

  • 2023-11-29: Erste Version