MacOS sed: соответствие началу или концу

MacOS sed: соответствие началу или концу

это беспокоит меня уже пару лет.

«соответствовать этому или тому» работает.
«соответствовать началу строки» работает.
«соответствовать концу строки» работает.
«соответствовать началу строки или концу строки» — не очень.

Все на 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

Связанный контент