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

问题描述 投票:0回答: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 中的字符串常量是用双引号括起来的字符序列(如“value”)。 在字符串内,某些转义 序列被识别,如 C 中所示。这些是:

...转义序列列表...

转义序列也可以用在常量正则表达式中(例如 /[ u000b]/ 匹配空白字符)。

在兼容模式下,八进制和十六进制转义序列表示的字符在用于 正则表达式常量。 因此,/a*b/ 等价于/a*b/。

我读到这里的方式,

val
中的
-v var=val
不是字符串常量,并且没有文本表明字符串常量转义规则适用。

我的问题:

  1. awk 语言是否有比手册页更权威的来源,如果有,它具体说明了什么?
  2. POSIX 对此有什么说法(如果有的话)?
  3. 所有版本的 Awk 都这样做吗?也就是说,如果我真的想要的话,我可以依赖正在完成的扩展吗?
bash awk posix
1个回答
4
投票

赋值是一个字符串常量。

标准的相关部分是:

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

或可移植字符集中的字母字符开头(请参阅 XBD 可移植字符集中的表),后跟一系列下划线、数字和可移植字符集中的字母,最后是

=
字符,应指定变量赋值而不是路径名。
=
之前的字符代表 awk 变量的名称;如果该名称是 awk 保留字(请参阅语法),则行为未定义。 后面的字符应被解释为好像它们出现在 awk 程序中,前后有双引号 (
"
) 字符,作为 STRING 标记(请参阅语法),除非最后一个字符是未转义的 ,它应被解释为文字 而不是序列
\"
的第一个字符。

© www.soinside.com 2019 - 2024. All rights reserved.