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的限制吗? 我的Linuxtesting运行bash 4.1.2。

奇怪的是,在我的linux环境下,bash的版本低于3.2,并且在那里也可以工作

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

 bash-3.2$ echo "abc" | sed 's/b/^[[31mz^[[m/' 31mz$'m/'azc 

再次,特定于BSD sed。 这是非常令人费解的:看起来像是什么东西导致shellsed以某种方式向terminal回显命令的一些损坏部分? 但是,它始终在命令的正确输出之前。 美元符号从哪里来?

(不要被我的命令中的颜色混淆(这是青色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”是红色的。)但是请注意,这可能需要在某些情况下,您可能需要双重转义您希望sed执行转义替换的东西。

哦。 所以shell版本不会影响到这一点。 不知道为什么我这么想。

罪魁祸首就是BSD sed不会做翻译,所以解决方法就是在sed命令字符串中使用原始转义字节的Ctrl + V方法。