【问题标题】:How can I replace a character in a specific JSON field?如何替换特定 JSON 字段中的字符?
【发布时间】:2021-05-26 09:03:48
【问题描述】:

如果我有这样内容的文件:

{"id":"doi-platelemetry-doi/doiplatelemetry","name":"doi/doiplatelemetry","location":"doi/doiplatelemetry/2.0.0/doiplatelemetry:2.0.0_49","component":"doi","tag":"2.0.0_49"},{"id":"doi-maintenance-service-doi/maintenance-service","name":"doi/maintenance-service","location":"doi/1.0.0/maintenance-service:1.0.0.681","component":"doi","tag":"1.0.0.681"}

我们如何仅在位置字段的值中将所有/ 替换为-?意思是,替换后的文件内容应该是:

{"id":"doi-platelemetry-doi/doiplatelemetry","name":"doi/doiplatelemetry","location":"doi-doiplatelemetry-2.0.0-doiplatelemetry:2.0.0_49","component":"doi","tag":"2.0.0_49"},{"id":"doi-maintenance-service-doi/maintenance-service","name":"doi/maintenance-service","location":"doi-1.0.0-maintenance-service:1.0.0.681","component":"doi","tag":"1.0.0.681"}

使用jq 可以很容易地实现这一点,但我正在寻找一种即使在jq 等工具不可用时也能正常工作的解决方案。

【问题讨论】:

  • 请在您的问题中以代码的形式添加您的努力,这是非常鼓励的,谢谢。
  • 不要试图修改 JSON,就好像它只是一堆字符。 JSON 是一种结构化格式,将其视为只是数据行会让您感到悲伤。使用jq 之类的工具来正确操作 JSON。
  • 是的,我可以使用 jq 看到预期的输出。只是在想我们是否可以在没有额外工具的情况下实现同样的目标。我在问题中粘贴的只是整个文档的一小部分,我认为没有jq 就必须有解决方案。在我原来的 json 文档上,这工作得很好:cat images.json | jq '.payload[].location |= "gsub("/";"-")' > images.json_modified
  • jq 是适合这项工作的工具。你在没有jq 的情况下尝试的任何操作都容易出错。

标签: json awk sed


【解决方案1】:

使用 awk:

awk -F, 'BEGIN { RS=","} /location/ { gsub("/","-",$0) } {ORS=","}1' file > file.tmp && mv -f file.tmp file

将记录分隔符设置为“,”,然后当记录包含位置时,使用gsub将所有“/”替换为“-”

【讨论】:

  • 这会拆分记录,然后进行修改。这不是对文件进行更改,以便我们获得最终输出。
  • 不用担心。我已经修改了输出到临时文件并将tmp文件复制到主文件的解决方案。
  • 对不起,我应该在我之前的评论中更加明确。重定向到临时文件,然后将其重命名为原始文件是很好理解的。但是进入该临时文件的不是 JSON 文档,而是拆分的记录。
  • 道歉。我忘了设置输出记录分隔符。立即尝试。
  • 立即尝试解决方案。
猜你喜欢
  • 1970-01-01
  • 2021-10-31
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 1970-01-01
相关资源
最近更新 更多