我最近发现,用于在命令行初始化变量的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
不是一个字符串常量,并且没有文本表明字符串常量转义规则适用。
我的问题:
答案 0 :(得分:2)
赋值是一个字符串常量。
the standard 的相关部分是:
-v分配 应用程序应确保赋值参数与赋值操作数的形式相同。指定的变量赋值应在执行awk程序之前发生,包括与BEGIN模式相关的操作(如果有的话)。可以指定多次出现此选项。
和
以便携式字符集中的下划线或字母字符开头的操作数(请参阅XBD可移植字符集中的表格),然后是便携式字符集中的一系列下划线,数字和字母,后跟' ='character,应指定变量赋值而不是路径名。 '='前面的字符代表awk变量的名称;如果该名称是awk保留字(请参阅语法),则行为未定义。 <等号>后面的字符应该被解释为好像它们出现在awk程序之前和之后是双引号(')'字符,作为STRING标记(参见语法),除非如果最后一个字符是未转义的,它应被解释为字面而不是序列“\”“
的第一个字符