如何从配置文件提取object开头缩进段落,awk正则为何失效
错误原因
- awk默认逐行读取输入,每次模式匹配仅针对当前单行内容,不支持跨行匹配,你写的包含
\n的跨行正则在默认模式下完全无法生效。 - 你写的范围匹配
/^object/,/^(\s.*\n)/逻辑错误:结束条件设置为匹配行首空白,而object后续的缩进属性行本身就符合这个条件,会直接触发匹配结束,无法输出后续的属性行。
正确解决方法
方案1:标志位控制(兼容性最高,所有awk版本通用)
直接用标志位控制输出范围即可,命令如下:
awk '/^object/{f=1;print;next} f{if(/^[[:space:]]/){print}else{f=0}}' file.cfg
逻辑说明:
- 匹配到行首为
object的行时,设置输出标志f=1,打印当前行后直接处理下一行 - 标志位为1时,若当前行以空白开头则打印,属于object的属性行;若行首无空白,说明object段落结束,重置标志位停止输出
方案2:GNU awk跨行正则实现(仅GNU awk支持)
如果要使用你编写的跨行正则,可以开启全文件读取模式:
gawk -v RS='^$' '{while(match($0,/^object.*\n(\s.*\n)+/m,arr)){print arr[0];$0=substr($0,RSTART+RLENGTH)}}' file.cfg
内容的提问来源于stack exchange,提问作者samuG
相关产品推荐
相关产品推荐

