awk中使用BEGIN块设置IGNORECASE出现无输出问题咨询
问题根因说明
1. 两条命令的执行逻辑差异
你给出的两条awk命令的规则结构完全不同,执行逻辑存在本质区别:
- 第一条命令
echo "Create" | awk 'IGNORECASE = 1;/create/;'包含两条独立的模式-动作规则:- 第一条规则的模式是赋值表达式
IGNORECASE = 1,赋值语句的返回值恒为真,你没有指定对应动作,awk默认执行print $0打印当前输入行,所以无论后续正则是否匹配,这一行已经会被输出 - 第二条规则是
/create/正则匹配,这时候IGNORECASE已经被前一条规则赋值,但匹配是否生效完全取决于你使用的awk实现
- 第一条规则的模式是赋值表达式
- 第二条命令
echo "Create" | awk 'BEGIN{IGNORECASE = 1};/create/;'只有一条生效的输入处理规则:- BEGIN块在读取任何输入前执行,仅完成一次变量赋值,不会触发打印动作
- 唯一的输入处理规则是
/create/正则匹配,如果IGNORECASE赋值不生效,大小写敏感的正则无法匹配大写开头的Create,因此没有任何输出
2. 核心问题:IGNORECASE是GNU awk(gawk)的专属扩展
IGNORECASE不属于POSIX awk标准定义的变量,只有GNU awk(gawk)支持这个全局开关,绝大多数系统默认自带的awk(比如macOS的BSD awk、轻量发行版的内置awk)都不识别这个变量,赋值后不会对正则匹配产生任何影响:
- 你第一条命令能输出完全是因为前一条赋值表达式作为恒真模式触发了默认打印,和大小写匹配没有关系
- 第二条命令没有恒真模式触发打印,大小写敏感的正则匹配不到
Create,因此没有返回结果
兼容写法参考
如果需要在所有awk实现中实现大小写不敏感匹配,可以统一用字符串转换的写法:
echo "Create" | awk 'tolower($0) ~ /create/'
内容的提问来源于stack exchange,提问作者Pro_gram_mer
相关产品推荐
相关产品推荐

