我最近发现 Awk-v VAR=VAL
用于在命令行上初始化变量的语法扩展了 VAL 中的转义序列。我以前认为这是将字符串传递给 Awk 的好方法,而无需先对它们运行转义函数。
例如,以下脚本:
awk -v VAR='x\tx' 'BEGIN{printf("%s\n", VAR);}'
我希望打印
x\tx
但实际上打印:
x x
顺便说一句:环境变量以未经修改的方式传递字符串,这个问题不是在问如何获得我以前期望的行为。
以下是手册页关于此事的内容:
-v var=val , --assign var=val在程序开始执行之前将值 val 分配给变量 var。此类变量值可用于 AWK 程序的 BEGIN 块。
再往下:
字符串常量 AWK 中的字符串常量是用双引号括起来的字符序列(如“值”)。在字符串中,可以识别某些转义序列,就像在 C 中一样。它们是:
...转义序列列表...
转义序列也可以在常量正则表达式中使用(例如,/[ \t\f\n\r\v]/ 匹配空白字符)。
在兼容模式下,由八进制和十六进制转义序列表示的字符在用于正则表达式常量时按字面意思处理。因此,/a\52b/ 等价于 /a*b/。
我读这个的方式,val
in-v var=val
不是字符串常量,也没有文字表明字符串常量转义规则适用。
我的问题:
- awk 语言是否有比手册页更权威的来源,如果有,它具体说明了什么?
- 如果有的话,POSIX 对此有什么看法?
- 是否所有版本的 Awk 都以这种方式运行,即如果我真的想要它,我可以依赖正在完成的扩展吗?