我需要替换文件中的一些文本,并在文件结尾之前添加几行。
我有这个:
{
"something": "option1",
"other": [
"value",
]
}
我需要这个:
{
"something": "option2",
"other": [
"value",
],
"more": {
"stuff": "yey!"
}
}
我试过这个scipt:
stuff=$1
value=",
\"more\": {
\"stuff\": \"$stuff\"
}"
sed -e "s/option1/option2" -e '$ \i$value' \
file1.json > file2.json
但我明白了:
{
"something": "option2",
"other": [
"value",
]
$value
}
我该如何正确地做到这一点?
答案 0 :(得分:1)
操纵json数据的唯一正确方法是使用JSON解析器/处理器。期!
使用 jq
处理器,它可以建立你的关系"使用JSON轻松舒适:
有效的JSON file1.json
:
{
"something": "option1",
"other": [
"value"
]
}
stuff="jq got you"
jq --arg stuff "$stuff" '.more = {stuff: $stuff}' file1.json
输出:
{
"something": "option1",
"other": [
"value"
],
"more": {
"stuff": "jq got you"
}
}
答案 1 :(得分:0)
这不是更好的方法,但如果你想用sed,你可以尝试
使用gnu sed
echo "$value" | sed ':A;/\n.*}/!{N;bA};h;s/.*//;N;$!{s/.*\n//;:B;N;$!{H;s/option1/option2/;s/\n.*//p;g;s/\(.*\)\(\n.*\n[^\n]*\)/\1/;x;s/\(.*\n\)\([^\n]*\)/\2/;bB}};H;g;s/\(.*\n\)\([^\n]*\)\(\n[^\n]*\)/\2/;G;s/\(.*\n\)\([^\n]*\n\)\([^\n]*\)/\1\3/;s/\([^\n]\)\(\n\)\(.*\)/\1\3/' /dev/stdin infile
或使用OpenBSD sed
cat scriptsed
sed ':A;/\n.*}/!{N;bA
}
h;s/.*//;N;$!{s/.*\n//;:B;N;$!{H;s/option1/option2/;s/\n.*//p;g;s/\(.*\)\(\n.*\n[^\n]*\)/\1/;x;s/\(.*\n\)\([^\n]*\)/\2/;bB
}
}
H;g;s/\(.*\n\)\([^\n]*\)\(\n[^\n]*\)/\2/;G;s/\(.*\n\)\([^\n]*\n\)\([^\n]*\)/\1\3/;s/\([^\n]\)\(\n\)\(.*\)/\1\3/'
并称之为
(echo "$value";cat infile) | ./scriptsed