我最近发现 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 中的字符串常量是用双引号括起来的字符序列(如“value”)。 在字符串内,某些转义 序列被识别,如 C 中所示。这些是:
...转义序列列表...
转义序列也可以用在常量正则表达式中(例如 /[ u000b]/ 匹配空白字符)。
在兼容模式下,八进制和十六进制转义序列表示的字符在用于 正则表达式常量。 因此,/a*b/ 等价于/a*b/。
我读到这里的方式,
val
中的-v var=val
是不是字符串常量,并且没有文本表明字符串常量转义规则适用。
我的问题:
赋值是一个字符串常量。
标准的相关部分是:
作业 应用程序应确保赋值参数与赋值操作数的形式相同。指定的变量赋值应在执行 awk 程序之前发生,包括与 BEGIN 模式相关的操作(如果有)。可以指定此选项多次出现。-v
和
以
或可移植字符集中的字母字符开头(请参阅 XBD 可移植字符集中的表),后跟一系列下划线、数字和可移植字符集中的字母,最后是 字符,应指定变量赋值而不是路径名。=
之前的字符代表 awk 变量的名称;如果该名称是 awk 保留字(请参阅语法),则行为未定义。=
后面的字符应被解释为好像它们出现在 awk 程序中,前后有双引号 ( ) 字符,作为 STRING 标记(请参阅语法),除非最后一个字符是未转义的"
,它应被解释为文字 而不是序列 的第一个字符。\"