это беспокоит меня уже пару лет.
«соответствовать этому или тому» работает.
«соответствовать началу строки» работает.
«соответствовать концу строки» работает.
«соответствовать началу строки или концу строки» — не очень.
Все на 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
решение1
Это может быть ошибкой в sed
реализации MacOS.
Ваш синтаксис работает у меня во FreeBSD 12 и Ubuntu 18:
$ sed -E 's/(^|$)/X/g'
Xhello worldX
Возможно, этого обходного пути будет достаточно, пока ошибка не будет устранена:
$ echo "hello world" | sed -E -e 's/^/X/' -e 's/$/X/'
Xhello worldX
Учитывая ваш комментарий относительно сложной строки замены, вышеизложенное можно немного обобщить, за счет небольшого усложнения:
$ 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