You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 21:24:03