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

在OSX上:

bash-3.2$echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
ax1b[31mzx1b[mc

而在Linux上:

$echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
azc

并且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

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

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

最佳答案
OS X的sed版本不会执行您要求的转义替换.你可以通过使用$’…’来解决这个问题,让bash在将字符串传递给sed之前进行替换:

$echo "abc" | sed 's/b/\x1b[31mz\x1b[m/'
ax1b[31mzx1b[mc
$echo "abc" | sed $'s/b/\x1b[31mz\x1b[m/'
azc

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

转载注明原文:linux – OSX sed:如何在`s`操作的第二个字段中使用转义字符? - 代码日志