我最近发现,Awk在命令行上初始化变量的-v VAR=VAL
语法扩展了VAL中的转义序列。我以前认为这是一种将字符串传递到Awk中的好方法,而无需首先对其运行转义函数。
例如,以下脚本:
awk -v VAR='xtx' 'BEGIN{printf("%sn", VAR);}'
我希望打印
xtx
但实际打印:
x x
顺便说一句:环境变量不加修改地传递字符串,这个问题并不是问如何获得我之前期望的行为。
以下是手册页对此事的看法:
-v var=val,--assign var=val在程序开始执行之前,将值val分配给变量var。此类变量值可用于AWK程序的BEGIN块。
再往下看:
字符串常量AWK中的字符串常量是用双引号括起来的字符序列(如"value")。在字符串中,特定转义序列被识别,如C。这些是:
转义序列列表。。。
转义序列也可以在常量正则表达式中使用(例如/[\t\f\n\r\v]/匹配空白字符)。
在兼容模式下,在正则表达式常量。因此,/a\52b/相当于/a*b/。
我读这篇文章的方式是,-v var=val
中的val
是而不是字符串常量,并且没有文本表明应用了字符串常量转义规则。
我的问题:
- 有没有比手册页更权威的awk语言来源?如果有,它指定了什么
- POSIX对此有何看法
- Awk的所有版本都是这样的吗?也就是说,如果我真的想要扩展,我可以依赖它吗
赋值是一个字符串常量。
该标准的相关章节包括:
-v分配应用程序应确保赋值自变量的形式与赋值操作数的形式相同。指定的变量赋值应在执行awk程序之前进行,包括与BEGIN模式相关的操作(如果有)。可以指定多次出现此选项。
和
以可移植字符集中的下划线或字母字符(请参阅XBD可移植字符集中的表)开头,然后是可移植字符集合中的下划线、数字和字母顺序序列,再加上"="字符的操作数应指定变量赋值,而不是路径名。"="前面的字符表示awk变量的名称;如果该名称是awk保留字(请参阅语法),则行为是未定义的。<等号>应被解释为它们出现在awk程序中,前面和后面都有一个双引号(')'字符,作为字符串标记(见语法),但如果最后一个字符是未转义的,则应将其解释为文字,而不是序列的第一个字符"\">