6

在 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 的语法突出显示)

在此处输入图像描述

4

2 回答 2

13

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

(您必须相信我,第二个中的“z”是红色的。)但是请注意,这可能需要在某些情况下,您可能需要双重转义您希望 sed 执行转义替换的内容。

于 2013-06-09T23:43:18.357 回答
2

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

罪魁祸首只是BSD sed 不进行翻译,因此解决方案只是Ctrl+V在sed 命令字符串中使用原始转义字节的方法。

于 2013-06-09T23:23:04.133 回答