使用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.
相关产品推荐
相关产品推荐

