MacOS sed: coincide con el principio o el final

MacOS sed: coincide con el principio o el final

Esto me ha estado molestando desde hace un par de años.

"combinar esto o aquello" funciona.
"Hacer coincidir el comienzo de la línea" funciona.
"Hacer coincidir el final de la línea" funciona.
"coincidir con el principio o el final de la línea", no tanto.

Todo en 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

Respuesta1

Esto puede ser un error en la implementación de MacOS sed.

Tu sintaxis me funciona en FreeBSD 12 y Ubuntu 18:

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

Quizás esta solución sea suficiente para sus necesidades hasta que se solucione el error:

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

Dado su comentario sobre una cadena de reemplazo compleja, lo anterior se puede generalizar un poco más, a expensas de un poco más de complejidad:

$ 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

información relacionada