1

我最近发现 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/。

我读这个的方式,valin-v var=val不是字符串常量,也没有文字表明字符串常量转义规则适用。

我的问题:

  1. awk 语言是否有比手册页更权威的来源,如果有,它具体说明了什么?
  2. 如果有的话,POSIX 对此有什么看法?
  3. 是否所有版本的 Awk 都以这种方式运行,即如果我真的想要它,我可以依赖正在完成的扩展吗?
4

1 回答 1

3

赋值是一个字符串常量。

该标准的相关部分是:

-v assignment 应用程序应确保赋值参数与赋值操作数的格式相同。指定的变量分配应在执行 awk 程序之前发生,包括与 BEGIN 模式相关的动作(如果有)。可以指定多次出现此选项。

以可移植字符集中的下划线或字母字符开头的操作数(请参阅 XBD 可移植字符集中的表),后跟可移植字符集中的一系列下划线、数字和字母,后跟“=”字符, 应指定变量赋值而不是路径名。'=' 前面的字符代表 awk 变量的名称;如果该名称是 awk 保留字(参见 Grammar ),则行为未定义。<equals-sign> 后面的字符应被解释为好像它们出现在 awk 程序中,前后都有双引号 (')' 字符,作为 STRING 标记(请参阅语法),除非最后一个字符是一个未转义的,它应该被解释为一个文字而不是序列“\”的第一个字符

于 2012-12-10T20:52:23.510 回答