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

如何用sed/awk在数组末尾数字与]前插入', 12'?

问题描述

我有一个大文件,内容如下:

[0, 1, 2, 3, 4, 5, 6,    8, 9, 10               ],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10               ],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10               ],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11],

需要更新整个文件,添加逗号(,)和数字12,使其变为如下格式:

[0, 1, 2, 3, 4, 5, 6,    8, 9, 10,                 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,                 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,                 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11, 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11, 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11, 12],

手动修改不现实,想找简便的sed/awk命令实现。

我试过命令:

sed 's/]/, 12]/g' <path_to_the_file>

但得到不符合预期的结果:

[0, 1, 2, 3, 4, 5, 6,    8, 9, 10                , 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10                , 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10                , 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11, 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11, 12],
    [0, 1, 2, 3, 4, 5, 6,    8, 9, 10,             11, 12],

这不是我想要的效果。

解决方案

用sed命令实现

通过分组匹配区分两种行的特征,精准完成替换:

sed -E 's/(11)([[:space:]]*)\]/\1, 12\2]/; s/(10)([[:space:]]*)\]/\1,                 12\2]/' <path_to_the_file>

如果需要直接修改原文件(原地替换),加上-i参数:

sed -i -E 's/(11)([[:space:]]*)\]/\1, 12\2]/; s/(10)([[:space:]]*)\]/\1,                 12\2]/' <path_to_the_file>

规则解释

  • 第一个替换规则:匹配以11加任意空格后接]的行,替换为11, 12加原有空格和],对应原本末尾是11的行。
  • 第二个替换规则:匹配以10加任意空格后接]的行,替换为10,加对应数量空格和12,再拼接原有空格与],保证格式对齐。

用awk命令实现

awk的方案更灵活,适合处理格式对齐需求:

awk '{
    if ($NF == "11],") {
        sub(/11]/, "11, 12]")
    } else {
        sub(/10[[:space:]]*]/, "10,                 12]")
    }
    print $0
}' <path_to_the_file>

要原地修改文件,可以先输出到临时文件再替换原文件:

awk '{
    if ($NF == "11],") {
        sub(/11]/, "11, 12]")
    } else {
        sub(/10[[:space:]]*]/, "10,                 12]")
    }
    print $0 > "temp_file"
}' <path_to_the_file> && mv temp_file <path_to_the_file>

内容的提问来源于stack exchange,提问作者Suryadevara Sai Harsha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 05:53:28