awk中的反斜杠问题

发布于 2022-08-29 19:25:45 字数 388 浏览 11 评论 0

下面这句awk代码

awk '{tempword="abc&"; gsub("&","\\\\&",tempword); print tempword }'

输出:

abc\&

我把反斜杠的数目换成1个和3个的时候,有警告:

awk: warning: escape sequence `\&' treated as plain `&'

换成两个却没有警告,不过当反斜杠为1个,2个或3个时,输出都是

abc&

请问这是怎么回事?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

墟烟 2022-09-05 19:25:45

恭喜你踩中了 awk 的坑!

关键在于,awk 首先读取你的语句,构建一个内部的副本供执行,然后再执行构建的副本。坑爹之处在于,构建和执行的时候都会处理 反斜杠,也就是说,会有两次转义!更坑爹的是,运行时 gsubsub 会采用不同的规则来处理反斜杠 !

首先是构建的规则,这个比较简单,特殊字符前带 \ 会转义,非特殊字符前带 \就表示这个字符自身。也就是说 \\ -> \\& -> &

第一次转义:

\\\\& -> \\+\\ + & = \\&
\\\& -> \\ + \& = \&
\\& -> \\ + & = \&
\& -> \ + & = &

所以我们看到,经过第一次转义后,三个反斜杠和两个反斜杠是一样的。

然后是第二次转义,这次规则不一样了,\& 表示 &,其他 \ 都不变动。(gsubsub\& 转成 &,然后其他反斜杠,在替换部分都不变动,前面匹配部分还是会转义的!)

所以,第二次转义后:

\\& -> \&
\& -> &
& -> &

总之,人生苦短,远离 awk !

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文