使用Awk/Sed实现固定长度文件匹配行指定位置的原位替换
解决方案
你原有的命令存在两个需修正的问题:
- 正则匹配
/^30*/实际匹配以3开头、后续跟任意个0的行,正确应为/^30/才能严格匹配以30开头的行 substr的第三个参数是截取长度而非结束位置,183-187共5个字符,正确写法是substr($0,183,5)
可用实现命令
使用GNU Awk(gawk 4.1.0及以上版本)的原位替换能力即可满足需求,全程不会改变行总长度:
gawk -i inplace ' BEGIN { # 预生成5个空格,对应183-187的字符长度 blank = sprintf("%5s", "") } # 非30开头的行直接输出,清空上一行缓存 ! /^30/ { print last_30_val = "" next } # 处理30开头的行 { curr_val = substr($0, 183, 5) if (curr_val == last_30_val) { # 拼接前后内容+空格,总长度完全不变 $0 = substr($0, 1, 182) blank substr($0, 188) } else { last_30_val = curr_val } print }' 你的目标文件名
补充说明
- 如果需要修改前自动备份原文件,把
-i inplace改为-i inplace=.bak,执行后会自动生成原文件名.bak的备份文件,避免操作失误丢失数据 - 该逻辑适配连续多段30开头的行场景,和你给出的示例输出要求完全匹配
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

