以下是我的 json 文件的摘录:
},
{
"name": "asdasd",
"script": "dsad.js",
"merge_logs": ture,
"error_file": "/ofghfghgfh.log",
"out_file": "/fghgfhfgg",
"cwd": "",
"autorestart": true,
"log_date_format" : "YYYY-MM-DD HH:mm Z",
"env": {
"NODE_ENV": "desa",
"KEY": "VtZOiz0Qc4afFs6j+h2r"
}
}]
我想在“KEY”后面添加一个短语:替换它现在的值。
我尝试了“sed”,但我将其添加到行尾
sed '/KEY/s/$/1234/g' .json
我需要使用“-i”选项直接更改文件。
答案1
sed
是这项工作的错误工具。正确的工具之一是jq
.
% 猫 wibble.json [ { “名称”:“asdasd”, “脚本”:“dsad.js” }, { "log_date_format" : "YYYY-MM-DD HH:mm Z", “环境”:{ "NODE_ENV": "德萨", “关键”:“VtZOiz0Qc4afFs6j+h2r” } } ] % jq '.[1]."env"."KEY" = "1234"' wibble.json [ { “名称”:“asdasd”, “脚本”:“dsad.js” }, { "log_date_format": "YYYY-MM-DD HH:mm Z", “环境”:{ "NODE_ENV": "德萨", “密钥”:“1234” } } ] %
它甚至发现您的 JSON 实际上无效。
% jq .奥蒂加.json 解析错误:第 4 行第 23 列的文字无效 %
答案2
您可以使用它(使用i
选项修改文件,但首先检查它是否正常工作):
sed -E 's/("KEY":) (".*")/\1 anything/g' .json
它将首先将线分成两部分,然后匹配"KEY":
,然后空格,然后用任何内容替换第二部分。
让我们说KEY='"1234"'
(通过使用单引号,KEY 的值将是"1234"
)。然后就可以使用了。
sed -E "s/(\"KEY\":) (\".*\")/\1 $KEY/g" .json
答案3
嵌套结构(如 xml、html、json 等)必须由了解数据模型的实用程序进行处理。如果依赖于诸如 之类的线路感知工具sed
,awk
那么总是有可能出现误报。
因此 JSON 输入必须由 JSON 感知工具处理。 jq 答案已经给出,这是基于的替代解决方案jtc
:
bash $ cat file.json | jtc -w'<KEY>l' -eu echo '"1234"' \;
{
"autorestart": true,
"cwd": "",
"env": {
"KEY": "1234",
"NODE_ENV": "desa"
},
"error_file": "/ofghfghgfh.log",
"log_date_format": "YYYY-MM-DD HH:mm Z",
"merge_logs": true,
"name": "asdasd",
"out_file": "/fghgfhfgg",
"script": "dsad.js"
}
bash $