awk中的反斜杠问题
下面这句awk代码
awk '{tempword="abc&"; gsub("&","\\\\&",tempword); print tempword }'
输出:
abc\&
我把反斜杠的数目换成1个和3个的时候,有警告:
awk: warning: escape sequence `\&' treated as plain `&'
换成两个却没有警告,不过当反斜杠为1个,2个或3个时,输出都是
abc&
请问这是怎么回事?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
恭喜你踩中了 awk 的坑!
关键在于,awk 首先读取你的语句,构建一个内部的副本供执行,然后再执行构建的副本。坑爹之处在于,构建和执行的时候都会处理 反斜杠,也就是说,会有两次转义!更坑爹的是,运行时
gsub
和sub
会采用不同的规则来处理反斜杠 !首先是构建的规则,这个比较简单,特殊字符前带
\
会转义,非特殊字符前带\
就表示这个字符自身。也就是说\\
->\
,\&
->&
第一次转义:
\\\\&
->\\
+\\
+&
=\\&
\\\&
->\\
+\&
=\&
\\&
->\\
+&
=\&
\&
->\
+&
=&
所以我们看到,经过第一次转义后,三个反斜杠和两个反斜杠是一样的。
然后是第二次转义,这次规则不一样了,
\&
表示&
,其他\
都不变动。(gsub
和sub
将\&
转成&
,然后其他反斜杠,在替换部分都不变动,前面匹配部分还是会转义的!)所以,第二次转义后:
\\&
->\&
\&
->&
&
->&
总之,人生苦短,远离 awk !