GNU sed 4.2.1匹配最后一条含T+数字行插入M09解决方案咨询
GNU sed 处理.nc文件插入指定行修正方案
问题根源
你原有命令的逻辑是在逐行读取M502块的过程中,碰到第一个符合.*T[0-9]\+格式的行就停止读取、直接执行替换,因此M09会错误插入到第一个匹配行前。要定位到块内最后一次出现的目标行,必须先把整个M502开头的文本块完整加载到模式空间,再利用正则的贪婪匹配特性做替换。
修正后命令(兼容GNU sed 4.2.1)
sed -i '/^M502/{ :loop $!{ N /\nM502/{ s/\nM502.*// x s/^.*// x G s/\n// } } $!b loop s/\(.*\)\n\([^\n]*T[0-9]\+\)/\1\nM09\n\2/ }' *.nc
逻辑说明
- 匹配到
^M502开头的行后进入循环,逐行读取后续内容追加到模式空间,直到碰到下一个M502块开头或者文件末尾,保证模式空间内是完整的单个M502块内容 - 碰到下一个M502块开头时,把下一个块的首行暂存到保持空间,处理完当前块后再放回模式空间进入下一轮处理,避免漏处理后续块
- 利用正则贪婪匹配特性:替换逻辑里的
\(.*\)会尽可能匹配最长的内容,直到最后一次出现[^\n]*T[0-9]\+格式的行的前侧,此时插入M09就正好是在块内最后一个匹配行的前面 - 如果你的坐标值有固定格式(比如以G/X/Y这类坐标前缀开头),可以把
[^\n]*替换为更精准的坐标匹配规则,避免误匹配无关的T+数字行
内容的提问来源于stack exchange,提问作者Vardenis Pavardenis
相关产品推荐
相关产品推荐

