符合POSIX标准的awk程序sub()转义结果及多实现差异问询
AWK程序的POSIX标准执行结果及实现差异说明
一、POSIX标准规定的执行结果
按照POSIX.1-2017 awk规范,该程序的正确输出应为-\a-(单个反斜杠加a),具体逻辑如下:
- 字符串常量解析:程序里的替换字符串
"-\\\\a-"包含4个反斜杠,awk字符串常量的规则是\\代表单个字面量\,所以这个字符串会被解析成"-\\a-"(也就是-、\、\、a、-的组合)。 - sub函数的替换规则:POSIX明确
sub的替换字符串里只有两种特殊序列:\\:替换成单个\;\n(n是1-9的数字):替换成对应编号的捕获组内容。
其他以\开头的序列(比如\a),\会被当作普通字符保留,和后面的a一起输出。
所以解析后的替换字符串"-\\a-"经过sub处理后,其中的\\变成单个\,剩下的\a直接保留,最终结果就是-\a-。
二、不同实现结果不一致的原因
差异出在替换字符串里\后跟非数字、非\字符时的处理逻辑:
- gawk与onetrueawk:这两个实现沿用了早期awk的传统处理逻辑,对替换字符串的转义规则更严格——所有未匹配特殊序列的
\都被视为需要二次转义的字符。比如它们会把替换字符串里的\a解析成要输出字面量\,因此需要额外转义,最终输出两个反斜杠(-\\a-),这种处理和POSIX最新规范不完全一致。 - mawk与goawk:这两个实现严格遵循POSIX规范,只把
\\和\n当作特殊序列,其他\开头的序列直接保留字面量,所以输出结果是-\a-,符合POSIX标准。
内容的提问来源于stack exchange,提问作者nlta
相关产品推荐
相关产品推荐

