我正在尝试将以下字符串替换为包含几行的文件中的另一个字符串。
"schema" : "AAAAA",
到
"schema" : "BBBBB",
目前,我正在执行以下命令来获取带有“schema”的相应行
当前架构=cat test.json | grep schema | awk {'print $3'}
它会给我值“AAAAA”,
我想用 BBBBB 替换 AAAAA
我使用了以下命令
sed -e 's/$currentSchema/BBBBB/p' test.json
但是,它无法在同一文件中替换。
答案1
JSON 文件示例:
[
{
"host": "myhost",
"schema": "AAAAA",
"lunch": "sandwich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
我们想将每个替换schema
为.我们可以这样做:AAAAA
BBBBB
jq
$ jq 'map(if .schema == "AAAAA" then .schema = "BBBBB" else . end)' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "QQQQQ",
"lunch": "pizza"
}
]
如果旧模式是什么并不重要:
$ jq 'map(.schema = "BBBBB")' file.json
[
{
"host": "myhost",
"schema": "BBBBB",
"lunch": "sandwhich"
},
{
"host": "myotherhost",
"schema": "BBBBB",
"lunch": "pizza"
}
]
由于jq
是一个正确的 JSON 解析器,因此即使文件以更紧凑的形式呈现(例如作为单行),这也可以工作
[{"host":"myhost","schema":"AAAAA","lunch":"sandwhich"},{"host":"myotherhost","schema":"QQQQQ","lunch":"pizza"}]
为了实际的问题 (在评论中),即找到.rules.behavior[]
其中具有.name
带值的键的元素mPulse
,然后将该元素更改.options.apiKey
为其他值:
jq '.rules.behaviors = [.rules.behaviors[]|select(.name == "mPulse").options.apiKey = "XXX"]' file.json
也就是说,.rules.behaviour
以这样的方式重写数组,使得.name
键为的元素mPulse
获得新的.options.apiKey
。
答案2
一些优化,其中最重要的是避免“无用的使用cat
”。你不需要cat file | grep pattern
;你可以grep pattern file
。由于您要grep
ping 到awk
,因此也可以简化:
currentSchema="$( cat test.json | grep schema | awk '{print $3}' )"
变成
currentSchema="$( awk '/schema/ {print $3}' test.json )"
现在,为您的sed
脚本。您正在使用强行情( '
) 围绕您的 sed 命令,这意味着您的 shell 变量将不会被解析。你需要使用弱报价( "
) 为此,请执行以下操作:
currentSchema="$( awk '/schema/ {print $3}' test.json )"
sed --in-place "s/$currentSchema/BBBBB/" test.json
答案3
为此,您不需要grep
, awk
, 和;可以完成所有任务(未经测试):sed
awk
awk '/schema/ {$3 = "BBBBB"} 1' test.json > /tmp/$$ && mv /tmp/$$ test.json
请尝试并报告回来。