sed命令替换写入

sed命令替换写入

我正在尝试将以下字符串替换为包含几行的文件中的另一个字符串。

"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为.我们可以这样做:AAAAABBBBBjq

$ 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。由于您要grepping 到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, 和;可以完成所有任务(未经测试):sedawk

awk '/schema/ {$3 = "BBBBB"} 1' test.json > /tmp/$$ && mv /tmp/$$ test.json

请尝试并报告回来。

相关内容