MacOS sed: corresponde ao início ou ao fim

MacOS sed: corresponde ao início ou ao fim

isso tem me incomodado há alguns anos.

"combinar isso ou aquilo" funciona.
"corresponder ao início da linha" funciona.
"corresponder ao final da linha" funciona.
"corresponder ao início da linha ou ao fim da linha", nem tanto.

Tudo no 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

Responder1

Isto pode ser um bug na sedimplementação do MacOS.

Sua sintaxe funciona para mim no FreeBSD 12 e no Ubuntu 18:

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

Talvez esta solução alternativa seja suficiente para suas necessidades até que o bug seja resolvido:

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

Dado o seu comentário sobre uma string de substituição complexa, o que foi dito acima pode ser generalizado um pouco mais, às custas de um pouco mais de complexidade:

$ 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

informação relacionada