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

这可能是 MacOSsed实现中的一个错误。

您的语法在 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

相关内容