Linux

sed 命令替換和寫入

  • October 16, 2018

我正在嘗試用包含幾行的文件中的另一個字元串替換以下字元串。

"schema" : "AAAAA",

"schema" : "BBBBB",

目前,我正在執行以下命令以獲取帶有“schema”的相應行

目前架構=cat test.json | grep schema | awk {'print $3'}

它會給我價值“AAAAA”,

我想用 BBBBB 代替 AAAAA

我使用了以下命令

sed -e 's/$currentSchema/BBBBB/p' test.json

但是,它不能在同一個文件中替換。

範例 JSON 文件:

[
 {
   "host": "myhost",
   "schema": "AAAAA",
   "lunch": "sandwich"
 },
 {
   "host": "myotherhost",
   "schema": "QQQQQ",
   "lunch": "pizza"
 }
]

我們想schemaAAAAA. 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.

引用自:https://unix.stackexchange.com/questions/475864