使用sed编辑JSON文件

Tom*_*ley 2 regex bash json sed

我需要编辑一个JSON文件,使用sed,将一些数据添加到文件中.JSON如下:

{
  'name':
  // more attributes that are already filled in 
}
Run Code Online (Sandbox Code Playgroud)

我写了这个sed命令试着这样做:

sed "s/(\'name\':)/\1\"hello\"\,/g" /path/to/file.json
Run Code Online (Sandbox Code Playgroud)

但是,我不断收到此错误:

sed: \1 not defined in the RE
Run Code Online (Sandbox Code Playgroud)

预期结果是:

{
  'name': "hello",
  // more attributes here, left untouched
}
Run Code Online (Sandbox Code Playgroud)

我知道这是一个不好的方法,但我不认为我能够使用这样的工具,jq因为该文件将在服务器上编辑,我无法jq在服务器上安装.如果有人有更好的解决方案,我会非常有兴趣听到它.谢谢!

Gil*_*not 8

如你所说,sed这里不是正确的工具,而是使用适当的JSON解析器:

输入json

$ cat json
{
  "name": "foobar"
}
Run Code Online (Sandbox Code Playgroud)

使用:

$ jq '.name |= "qux"' json | tee json 
Run Code Online (Sandbox Code Playgroud)

(最新的工作小文件)

或使用:

perl -i -MJSON -0ne '
    my $DS = decode_json $_;
    $DS->{name} = "qux";
    print encode_json $DS
' json
Run Code Online (Sandbox Code Playgroud)

删除-i,如果你想不编辑文件来测试命令开关到位

输出json

$ cat json
{
  "name": "qux"
}
Run Code Online (Sandbox Code Playgroud)


Win*_*ute 5

你的反斜杠在错误的地方。'不需要转义,但括号需要转义。这有效:

sed "s/\('name':\)/\1\"hello\"\,/g" /path/to/file.json
Run Code Online (Sandbox Code Playgroud)

注意:我假设 file.json 不是 json 文件,而是特制的模板,否则此替换没有任何意义(结果不会是 JSON)。使用 sed 处理 JSON 文件肯定是一个坏主意,因此如果您尝试修改 JSON 而不是生成它,请查看jqor so。

  • 我添加了一些内容以使其清楚。不过,如果输出文件是有效的 JSON,输入文件就不能是有效的 JSON,因此“使用 JSON 工具”对于这个问题没有帮助。 (2认同)