在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。 这是非常令人费解的:看起来像是什么东西导致shell或sed
以某种方式向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方法。