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

これは MacOS の実装におけるバグである可能性がありますsed

あなたの構文は 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

関連情報