首页 > 解决方案 > 使用 sed 替换 json 值

问题描述

我有一个 .json 文件,我需要在其中替换特定值:

{
    "partitions": [
        {
            "filesystem_type": "FAT",
            "label": "boot",
            "mkfs_options": "-F 32",
            "partition_size_nominal": 256,
            "uncompressed_tarball_size": 53,
            "want_maximised": false,
            "sha256sum": "dd54710df7756e64cff43bba3c930e85c97f22d43e0d32bc37396be34166c148"
        },
        {
            "filesystem_type": "ext4",
            "label": "root",
            "mkfs_options": "-O ^huge_file",
            "partition_size_nominal": 1415,
            "uncompressed_tarball_size": 1015,
            "want_maximised": true,
            "sha256sum": "bb0892d4a028ae9d282849d05adf851fe54173013f6331e74a4bdd07e4af8dab"
        }
    ]
}

特别是,我需要更换分区的partition_size_nominal标签root

我能想出的最好方法是非常hacky:

#!/bin/bash
fname=partitions.json
tag=partition_size_nominal
newvalue=2942
rootline=$(sed -n '/label.*root/=' $fname | head -1)
blockstart=$(sed -n '1,'"$rootline"'p' $fname | tac | sed -n '/{/=' | head -1)
blockstart=$(( rootline - blockstart + 1 ))
blockend=$(sed -n ''"$blockstart"',$p' $fname | sed -n '/}/=' | head -1)
blockend=$(( blockstart + blockend -1 ))
sed ''"$blockstart"','"$blockend"'s/"'"$tag"'".*/"'"$tag"'": '"$newvalue"',/' $fname

基本思路是:找到根标签标签,向后搜索块开始,向前搜索块结束,替换块内的分区大小标签值。我不能假设分区大小标签在标签标签之后,因此搜索块边界。

有谁知道针对这种情况的更优雅的解决方案?

标签: jsonbashsed

解决方案


如前所述,jq这是在 shell 脚本中使用 JSON 的方法。这:

jq --arg size "$newvalue" '
  .partitions |= [.[] | if .label == "root" then
                          .partition_size_nominal |= ($size | tonumber)
                        else
                          .
                        end]' "$fname"

输出

{
  "partitions": [
    {
      "filesystem_type": "FAT",
      "label": "boot",
      "mkfs_options": "-F 32",
      "partition_size_nominal": 256,
      "uncompressed_tarball_size": 53,
      "want_maximised": false,
      "sha256sum": "dd54710df7756e64cff43bba3c930e85c97f22d43e0d32bc37396be34166c148"
    },
    {
      "filesystem_type": "ext4",
      "label": "root",
      "mkfs_options": "-O ^huge_file",
      "partition_size_nominal": 2942,
      "uncompressed_tarball_size": 1015,
      "want_maximised": true,
      "sha256sum": "bb0892d4a028ae9d282849d05adf851fe54173013f6331e74a4bdd07e4af8dab"
    }
  ]
}

(假设在你的 shell 脚本中设置了变量)


推荐阅读