使用Sed查找和替换json字段

时间:2016-08-31 01:48:06

标签: json bash unix sed

我有一组json文件,其中在最后一个键值对之后我有逗号需要被替换。

{
    "RepetitionTime": 0.72,
    "TaskName":"WM",
    "Manufacturer": "Siemens",
    "ManufacturerModelName": "Skyra",
    "MagneticFieldStrength": 3.0,
    "EchoTime":"0.033",
}

应该看起来像:

{
    "RepetitionTime": 0.72,
    "TaskName":"WM",
    "Manufacturer": "Siemens",
    "ManufacturerModelName": "Skyra",
    "MagneticFieldStrength": 3.0,
    "EchoTime": 0.033
}

我怎样才能使用sed实现这个目标。 编辑:更改输出 - 不应该有任何""大约0.033。

sed -i  \'7i'\\t'\"EchoTime\": \0.033\' sub-285345_task-WM_acq-RL_bold.json

没有帮助我。我尝试过其他一些选择但没有成功..

我也在python中使用了simplejson和json包。但鉴于文件是json,json.loads(文件)抛出错误..

我现在更喜欢sed over python ..

3 个答案:

答案 0 :(得分:1)

 sed -Ei.bak 's/^([[:blank:]]*"EchoTime[^"]*":)"([^"]*)",$/\1\2/' file.json

会这样做

示例输出

{
    "RepetitionTime": 0.72,
    "TaskName":"WM",
    "Manufacturer": "Siemens",
    "ManufacturerModelName": "Skyra",
    "MagneticFieldStrength": 3.0,
    "EchoTime":0.033
}

备注

  • E启用扩展正则表达式。
  • i要启用就地编辑,会创建一个扩展名为.bak的备份文件。

答案 1 :(得分:0)

请尝试以下命令。

sed -i 's#\(.*\)EchoTime":"\(.*\)",$#\1EchoTime":\2#' sub-285345_task-WM_acq-RL_bold.json

答案 2 :(得分:0)

如果您不限于sed并打开awk,则可以使用以下内容:

awk ' BEGIN{FS=OFS=":"}/EchoTime/ {gsub(/\"|\,/,"",$2)}1'  file.json
{
    "RepetitionTime": 0.72,
    "TaskName":"WM",
    "Manufacturer": "Siemens",
    "ManufacturerModelName": "Skyra",
    "MagneticFieldStrength": 3.0,
    "EchoTime":0.033
}

说明:

FS=OFS=":":这会将输入和o / p字段分隔符设置为“:”

/EchoTime/:搜索包含EchoTime的行。

/EchoTime/{gsub(/\"|\,/,"",$2)}:找到回显时间后,使用global sub替换该行的第二个字段中的双引号和逗号。

1:awk的默认操作是打印。

要在原始文件中进行更改:

awk ' BEGIN{FS=OFS=":"}/EchoTime/ {gsub(/\"|\,/,"",$2)}1'  file.json >json.tmp && mv json.tmp file.json