使用Sed查找并替换json字段

使用Sed查找并替换json字段,json,bash,unix,sed,Json,Bash,Unix,Sed,我有一组json文件,在最后一个键值对之后,我有需要替换的逗号 { "RepetitionTime": 0.72, "TaskName":"WM", "Manufacturer": "Siemens", "ManufacturerModelName": "Skyra", "MagneticFieldStrength": 3.0, "EchoTime":"0.033", } 它应该是这样的: { "RepetitionTime": 0.72

我有一组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(file)会抛出错误


我现在更喜欢sed而不是python

请尝试以下命令

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

样本输出

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

注释

  • E
    以启用扩展正则表达式
  • i
    要启用就地编辑,将创建扩展名为.bak的备份文件
如果您不限于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)}
:找到EchoTime后,使用全局sub替换该行第二个字段中的双引号和逗号

1
:awk的默认操作是打印

要在原始文件中进行更改,请执行以下操作:

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

我对输出做了一个小的编辑。如何处理这一更改..?开头的
*
是不明智的。请检查是否有空格。@mona_sax我只想保留json文件的缩进。使用空格无论如何都不会让您失去缩进。
awk ' BEGIN{FS=OFS=":"}/EchoTime/ {gsub(/\"|\,/,"",$2)}1'  file.json >json.tmp && mv json.tmp file.json