我在这里阅读了有关 Awk 拆分行为的信息:
[...] split函数的fs参数(参见字符串函数)应被解释为扩展的正则表达式。这些可以是ERE标记或任意表达式,并且应以与or运算符 右侧相同的方式进行解释。
~
!~
和:
如果右侧操作数是词法标记 ERE以外的任何表达式,则表达式的字符串值应解释为扩展的正则表达式,包括上述转义约定。
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/awk.html#tag_20_06_13_04
但是我注意到一个意想不到的结果,使用这段代码:
BEGIN {
print split("te.st", q, ".")
}
我希望 the.
代表任何字符,并且结果为6
. 但是我所有的测试都返回了2
。运行这段代码给出了预期的6
:
BEGIN {
print split("te.st", q, /./)
}
经测试:
- 呆呆
- gawk --posix
- 1.3.4 版本
- 1.3.3 版本
- nawk(原始 awk)
我误解了文档还是这是一个错误?
这不是错误;只是在尝试将现有做法编纂时,标准不够明确。
mawk(1) 手册更明确:
此外,来自当前来源的 GNU awk 手册:
这是 susv4标准的描述:
您的示例匹配 2.b。
即使明确提到
FS
,在所有 awk 实现中使用任何参数代替它作为第三个参数的行为都是相同的split
,包括在该参数是空格的情况下。行为不太可能改变,因为
FS
变量只是一个字符串(awk
没有正则表达式对象,例如javascript
orperl
;您不能将正则表达式分配给变量,如a=/./
or$a=qr/./
);它是split
函数(隐式或显式调用)确实如上所述解释其参数。此行为的起源可能与“旧”awk 兼容,其中
FS
(或 的第三个参数split
)始终被视为单个字符。示例(在 unix v7 上):