繁体   English   中英

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

[英]OSX sed: how to use the escape character in the second field of a `s` operation?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM