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

使用Bash+awk/sed为JSON引号块内的%s添加索引

问题:批量替换JSON字符串中的%s为带索引的%n$s格式

原始JSON文件内容:

{
    "Text %s and %s": "Text2 %s or %s",
    "Here is \"Name %s\" and %s and %s": "Blabla %s and %s or %s"
}

需要转换为:

{
    "Text %1$s and %2$s": "Text2 %1$s or %2$s",
    "Here is \"Name %1$s\" and %2$s and %3$s": "Blabla %1$s and %2$s or %3$s"
}

要求将每个引号包裹的字符串内的%s按顺序替换为%1$s、%2$s……的形式,每个引号块内单独计数。

之前尝试的awk代码未达到预期效果:

awk -F'"' '                                                                                                         
  BEGIN { idx = 1 }
  {
    for (i=1; i<=NF; i++) {
      if (i % 2 == 0) {
        gsub(/%s/, "%" idx++ "$s", $i)
      }
    }
    idx = 1
  }
  1
' my.json

解决方案:修正后的awk命令

原代码的问题在于gsub会一次性把当前字段内所有%s替换为同一个递增后的索引,无法实现逐个替换并计数。以下是修正后的命令:

awk -F'"' '{
    line = ""
    for (i=1; i<=NF; i++) {
        if (i % 2 == 0) {
            idx = 1
            while (match($i, /%s/)) {
                $i = substr($i, 1, RSTART-1) "%" idx "$s" substr($i, RSTART+2)
                idx++
            }
        }
        line = line $i (i < NF ? "\"" : "")
    }
    print line
}' my.json

逻辑说明:

  • 以双引号"作为分隔符,遍历每行的所有字段
  • 针对偶数位字段(即被引号包裹的目标内容),初始化索引idx=1
  • 通过match逐个定位%s,替换为带当前索引的格式后,索引自增
  • 最后将处理后的字段重新拼接成完整行输出

内容的提问来源于stack exchange,提问作者Dmitry K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 20:58:25