使用 bash 替换 - 动态值

replace using bash - Dynamic value

我有一个 Json 文件,其中包含以下值

cat file
    {
    "key1": "value1"
    "key2": "value2",
    }

我想更改 value1 和 value2。价值观是动态的,它会随着时间的推移而变化。我的 sed 应该可以使用任何值,并且我的查找应该是按键。 “ 我的 sed 命令没有帮助。

 sed -i 's/*\"key2\":*/\"key2\": "someothervalue2"/' file

你好像对正则表达式有点陌生,你的表达方式有一些问题。例如。匹配您使用 . 的任何字符,然后添加星号 (.*) 以匹配它 0 次或更多次。您应该花一些时间来熟悉正则表达式,因为它将为您节省时间和将来的麻烦。

但为了达到预期的结果,我使用了这个命令:

sed -i -r 's/("key2" ?= ?).*,?/"someothervalue2",/' file

如果您要经常这样做,您应该将其放入脚本中,这样您就可以键入 ./myScript key new_value file

尝试使用 awk 解决方案一次。

awk ' ~ /key[12]/{match([=10=],/^ +/);printf substr([=10=],RSTART,RLENGTH);sub(/value[0-9]+/,"someothervalue2",);printf("%s%s",[=10=],RS);next} 1'  Input_file

awk '
 ~ /key[12]/{
  match([=11=],/^ +/);
  printf substr([=11=],RSTART,RLENGTH);
  sub(/value[0-9]+/,"someothervalue2",);
  printf("%s%s",[=11=],RS);
  next
}
1
'  Input_file

输出如下:

     {
     "key1" = "someothervalue2"
     "key2" = "someothervalue2",
     }

如果您的 Input_file 中有多个 key1 和 key2,请将 key[12] 更改为 key[0-9]+,然后告诉我们进展如何。

您应该使用合适的 json-parser 而不是 sed,例如jq.

infile

{
  "key1" : "value1",
  "key2" : "value2"
}

您可以像这样替换它的值:

jq '.key1 = "foo" | .key2 = "bar"' < infile

输出:

{
  "key1": "foo",
  "key2": "bar"
}