awk应该在命令行分配的变量中扩展转义序列吗?

时间:2012-12-10 20:44:31

标签: bash awk posix

我最近发现,用于在命令行初始化变量的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中那样识别序列。这些是:

     

...逃脱序列列表...

     

转义序列也可以在常量正则表达式中使用(例如,/ [\ t \ f \ n \ r \ t] /匹配空白字符)。

     

在兼容模式下,八进制和十六进制转义序列表示的字符在使用时按字面意思处理   正则表达式常量。因此,/ a \ 52b /等同于/ a * b /.

我读这篇文章的方式,val中的-v var=val 是一个字符串常量,并且没有文本表明字符串常量转义规则适用。

我的问题:

  1. awk语言的权威来源是否比手册页更具权威性?如果是,那么它指定了什么?
  2. POSIX对此有什么看法,如果有的话?
  3. 所有版本的Awk都是这样做的,即如果我真的想要它,我可以依赖扩展吗?

1 个答案:

答案 0 :(得分:2)

赋值是一个字符串常量。

the standard 的相关部分是:

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

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

的第一个字符