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



我最近发现,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而不是字符串常量,并且没有文本表明应用了字符串常量转义规则。

我的问题:

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

赋值是一个字符串常量。

该标准的相关章节包括:

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

以可移植字符集中的下划线或字母字符(请参阅XBD可移植字符集中的表)开头,然后是可移植字符集合中的下划线、数字和字母顺序序列,再加上"="字符的操作数应指定变量赋值,而不是路径名。"="前面的字符表示awk变量的名称;如果该名称是awk保留字(请参阅语法),则行为是未定义的。<等号>应被解释为它们出现在awk程序中,前面和后面都有一个双引号(')'字符,作为字符串标记(见语法),但如果最后一个字符是未转义的,则应将其解释为文字,而不是序列的第一个字符"\">

相关内容

  • 没有找到相关文章