替换使用bash - 动态值

时间:2017-08-15 06:06:48

标签: json unix sed text-processing

我有一个具有以下值的Json文件

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

我想更改value1和value2。价值观是动态的,它会随着时间的推我的sed应该适用任何价值,而我的观点应该是关键。 " 我的sed命令没有帮助。

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

3 个答案:

答案 0 :(得分:1)

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

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

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

输出如下:

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

如果你的Input_file中有多个key1和key2,那么将键[12]改为键[0-9] +,然后告诉我们它是如何进行的。

答案 1 :(得分:1)

您应该使用正确的json-parser而不是sed,例如jq

infile中

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

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

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

输出:

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

答案 2 :(得分:0)

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

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

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

如果你打算这么做,你应该把它放到一个脚本中,这样你就可以输入./myScript key new_value file