MacOS sed: Entweder Anfang oder Ende abgleichen

MacOS sed: Entweder Anfang oder Ende abgleichen

das nervt mich jetzt schon seit ein paar Jahren.

„Dies oder das abgleichen“ funktioniert.
„Zeilenanfang abgleichen“ funktioniert.
„Zeilenende abgleichen“ funktioniert.
„Zeilenanfang oder Zeilenende abgleichen“ nicht so sehr.

Alles auf MacOS.

echo "hello world" | sed -E 's/(h|d)/X/g'
Xello worlX

echo "hello world" | sed -E 's/(^)/X/g'
Xhello world

echo "hello world" | sed -E 's/($)/X/g'
hello worldX

echo "hello world" | sed -E 's/(^|$)/X/g'
Xhello world

Antwort1

Dies kann ein Fehler in sedder Implementierung von MacOS sein.

Ihre Syntax funktioniert bei mir unter FreeBSD 12 und Ubuntu 18:

$ sed -E 's/(^|$)/X/g'
Xhello worldX

Vielleicht reicht dieser Workaround für Ihre Zwecke aus, bis der Fehler behoben ist:

$ echo "hello world" | sed -E -e 's/^/X/' -e 's/$/X/'
Xhello worldX

Angesichts Ihres Kommentars zu einer komplexen Ersetzungszeichenfolge kann das oben Gesagte auf Kosten einer etwas höheren Komplexität noch etwas weiter verallgemeinert werden:

$ X='replacement text here'
$ printf "echo 'hello world' | sed -E -e 's/^/%s/' -e 's/$/%s/'" "$X" "$X" | sh 
replacement text herehello worldreplacement text here

verwandte Informationen