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 sed
implementaçã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