OSX sed:如何在`s`操作的第二个字段中使用转义字符?

Ste*_* Lu 5 linux macos bash shell terminal

在OSX上:

bash-3.2$ echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
ax1b[31mzx1b[mc
Run Code Online (Sandbox Code Playgroud)

而在Linux上:

$ echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
azc
Run Code Online (Sandbox Code Playgroud)

并且z正确显示红色.

这是bash 3.2的限制吗?我的Linux测试在这里运行bash 4.1.2.

奇怪的是在我的Linux环境中工作时bash是3.2以下的版本,它也适用于那里.

此外,这可能是相关的,但可能不是:

bash-3.2$ echo "abc" | sed 's/b/^[[31mz^[[m/'
31mz$'m/'azc
Run Code Online (Sandbox Code Playgroud)

再次,具体到BSD sed.这是非常令人费解的:似乎有什么东西导致shell或sed以某种方式将命令的一些错位部分回应到终端?但是,它总是在命令的正确输出之前.那个美元符号来自哪里?

(不要被我的命令中的颜色混淆(在青色unicode字符之后看起来像是一个不太弯曲的>,这是我的提示),我使用语法高亮显示zsh)

在此输入图像描述

Gor*_*son 12

OS X的sed版本不会执行您要求的转义替换.你可以通过$'...'在将字符串交给sed之前使用bash进行替换来解决这个问题:

$ echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
ax1b[31mzx1b[mc
$ echo "abc" | sed $'s/b/\x1b[31mz\x1b[m/'
azc
Run Code Online (Sandbox Code Playgroud)

(你必须相信我,"z"在第二个中是红色的.)但请注意,这可能需要在某些情况下你可能需要双重逃避你想要的事情来进行转义替换.