json - 使用 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
基本思路是:找到根标签标签,向后搜索块开始,向前搜索块结束,替换块内的分区大小标签值。我不能假设分区大小标签在标签标签之后,因此搜索块边界。
有谁知道针对这种情况的更优雅的解决方案?
解决方案
如前所述,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 脚本中设置了变量)
推荐阅读
- oracle - 如何查询同一列日期之间的日期差异?
- node.js - Handlebars 未显示数组内对象的元素
- skype - 如何在 linux 中下载 Skype 录制的会话?
- google-cloud-platform - 在哪里可以找到 Google Cloud Platform API 日志
- javascript - 如何在另一个文件中使用类的实例?
- python-3.x - 在画布中生成图形及其连接的 pdf 报告
- java - Spring boot 应用启动挂在“started bean '_org.springframework.integration.errorLogger'”线上
- php - 使用 PHP 将 JSON 数据注入 javascript - 感到困惑
- javascript - 如何使用 find 或 indexOf 转换此代码?
- cmd - 如何使用 GDAL TRANSFER 转换文件夹?