如何替换特定JSON字段中的字符?

如何替换特定JSON字段中的字符?,json,awk,sed,Json,Awk,Sed,如果我有包含此类内容的文件: {"id":"doi-platelemetry-doi/doiplatelemetry","name":"doi/doiplatelemetry","location":"doi/doiplatelemetry/2.0.0/doiplatelemetry:2.0.0_49","component":"doi"

如果我有包含此类内容的文件:

{"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
这样的工具不可用时也可以使用。

使用awk:

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

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

请在问题中以代码的形式添加您的努力,这是非常鼓励的,谢谢。不要试图修改JSON,就好像它只是一堆字符一样。JSON是一种结构化格式,将其视为一行行数据会让您感到悲伤。使用像
jq
这样的工具来正确操作JSON。是的,我可以使用
jq
看到预期的输出。我只是在想,我们是否可以在没有额外工具的情况下实现同样的目标。我在问题中粘贴的只是整个文档的一小部分,我认为必须有没有
jq
的解决方案。在我的原始json文档中,它工作得非常好:
cat images.json | jq'.payload[].location |=“gsub(“/”;“-”)'>images.json_modified
jq
是这项工作的合适工具。如果不使用
jq
进行任何尝试,都会很容易出错。这会分割记录,然后进行修改。这不是对文件进行更改,以便我们获得最终输出。不用担心。我已将解决方案修改为输出到临时文件,然后将tmp文件复制到主控文件。抱歉,我在前面的评论中应该更明确。重定向到临时文件,然后将其重命名为原始文件是很容易理解的。但进入该临时文件的不是JSON文档,而是拆分的记录。抱歉。我忘了设置输出记录分隔符。请立即尝试。立即尝试解决方案。