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

时间:2013-06-09 23:20:15

标签: linux macos bash shell terminal

在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语法高亮显示)

enter image description here

2 个答案:

答案 0 :(得分:11)

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”在第二个中是红色的。)但请注意,这可能要求在某些情况下你可能需要双重逃避你想要的东西才能进行逃避替换

答案 1 :(得分:2)

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

罪魁祸首就是BSD sed没有进行转换,所以解决方案就是使用sed命令字符串中的原始转义字节的 Ctrl + V 方法。