【问题标题】:Use Sed to find and replace json field使用 Sed 查找和替换 json 字段
【发布时间】:2017-01-07 10:46:10
【问题描述】:

我有一组 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..

【问题讨论】:

    标签: json bash unix sed


    【解决方案1】:

    请尝试以下命令。

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

    【讨论】:

    • 我对输出做了一个小的编辑。如何应对这种变化..?
    • 开头的.* 是不明智的。你检查空格。
    • @mona_sax 我只想保留 json 文件的缩进。
    • 使用空格不会让你失去缩进。
    【解决方案2】:
     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 的备份文件。

    【讨论】:

      【解决方案3】:

      如果您不限于 sed 和 open for 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)}: 找到回显时间后,使用全局 sub 替换该行第二个字段中的 、双引号和逗号。

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

      更改原始文件:

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

      【讨论】:

        猜你喜欢
        • 2014-12-04
        • 2020-08-05
        • 2013-03-23
        • 2021-10-06
        • 1970-01-01
        • 2011-09-04
        • 2019-11-29
        • 2016-05-12
        相关资源
        最近更新 更多