【问题标题】:Need sed command to replace JSON property value需要 sed 命令来替换 JSON 属性值
【发布时间】:2021-03-13 09:11:22
【问题描述】:

我有一个如下所述的 JSON 文件

{"channel1":{"number":"xxxxxxxxx","recording_id":"hsdsghgsdhfsgjsjdfjsdjjsdgjgsjghjsdfsdj"},"channel2":{"number":"xxxxxxx","status":"ANSWER"}}

我需要将recording_id 属性替换为空

我的意思是我需要最终输出

{"channel1":{"number":"xxxxxxxxx","recording_id":""},"channel2":{"number":"xxxxxxx","status":"ANSWER"}}

我已经尝试了下面提到的解决方案

sed -i 's/\"recording_id\":.*/\"recording_id\": '""'/g' filename

得到的输出为

{"channel1":{"number":"xxxxxxxxx","recording_id":

这不是我想要的。我该如何解决这个问题?

【问题讨论】:

    标签: json bash sed


    【解决方案1】:

    您对引用和正则表达式感到困惑。

    首先,.* 将匹配输入行的整个剩余部分;您(正在尝试)将所有内容替换为 "",这样就解释了为什么您的输出会被截断。

    其次,在单引号内,您可以简单地逐字使用双引号。

    现在,只匹配"recording_id": 字段的正则表达式类似于"[^"]*",它表示匹配下一个双引号,然后是我们能找到的尽可能多的非双引号字符,然后是另一个双引号引用。

    sed -i 's/"recording_id": *"[^"]*"/"recording_id": ""/' filename
    

    除非您期望每个输入行有多个匹配项,否则/g 标志在这里是无用的。

    但与以往一样,正确的解决方案是使用支持 JSON 的工具,例如 jqsed 在这方面是出了名的差,因为(相当简单的)正则表达式无法将顶级 JSON 中的 "recording_id" 与例如相同的字符串区分开来。结构中其他位置的字典中的值。

    【讨论】:

    • 您好,感谢您的解决方案。有效。但它不会在第二次出现时替换相同的内容。
    • 您的示例只有一个实例。就像它说的那样,如果您希望每行有多个匹配项,请添加 g 标志。
    【解决方案2】:

    主要问题是您的模式中的 .* 匹配字符串末尾的所有内容,但您只想替换 recording_id 属性的值。

    使用理解 JSON 的工具会更好,但如果你必须使用 sed 来做,那么你可以像这样修改你的命令:

    sed -i 's/"recording_id":"[^"]*/"recording_id":"/g' filename
    

    模式片段[^"]* 匹配最多零个或多个字符"

    还请注意,如图所示,您不需要转义单引号字符串中的双引号。事实上,原来的引用不是由shell处理的,而是由sed处理的,而引号对sed首先没有特殊意义。

    【讨论】:

    • 随着单引号被shell处理,空引号""实际上在外部单引号也将被删除。
    【解决方案3】:

    如果您不必必须使用sed,那么您可以像这样使用jq

    jq '.channel1.recording_id = ""' your_file.json > new_file.json
    

    【讨论】:

      猜你喜欢
      • 2014-06-03
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 2011-08-31
      • 2022-01-10
      • 2019-02-11
      • 2018-09-16
      相关资源
      最近更新 更多