【问题标题】:Replace the string in a file in Unix - replace the part of the matching regular expression在 Unix 中替换文件中的字符串 - 替换匹配正则表达式的部分
【发布时间】:2021-05-25 04:47:17
【问题描述】:

我有一个具有这种重复结构的 JSON 文档

{"version":"21.0.0.1","artifact":"artifact","payload":[{"id":"ng-at-ng/at","name":"ng/at","location":"apmservices/at:21.3.0.2-linux-amd64","component":"core","tag":"21.3.0.2-linux-amd64"},{"id":"doi-dspintegrator-doi/dspintegrator","name":"doi/dspintegrator","location":"doi/1.3.    3/dspintegrator:2.0.0-RELEASE_183","component":"doi","tag":"2.0.0-RELEASE_183"}]}

只要有/,我想用- 替换所有"location" 标记的值。所以替换后,上面的文字就变成了:

{"version":"21.0.0.1","artifact":"artifact","payload":[{"id":"ng-at-ng/at","name":"ng/at","location":"apmservices-at:21.3.0.2-linux-amd64","component":"core","tag":"21.3.0.2-linux-amd64"}, {"id":"doi-dspintegrator-doi/dspintegrator","name":"doi/dspintegrator","location":"doi-1.3.3-dspintegrator:2.0.0-RELEASE_183","component":"doi","tag":"2.0.0-RELEASE_183"}]}

注意原始JSON文档中"location"标签的值可以有多个/-

阅读其他一些帖子,似乎应该使用sed 中的-E 选项,但我不知道如何使它工作。请问有人可以帮忙吗?

【问题讨论】:

  • 你能解决一个更简单的问题吗?你能把"abcabc":"a/b/c"改成"abcabc":"a-b-c"吗?
  • 如果只出现一次,那我可以。但是位置键多次出现,因此不确定如何限制任何正则表达式以仅捕获该部分。
  • 你知道如何使用t 反复执行相同的替换吗?
  • 我的问题是如何编写一个正则表达式,以便一次匹配所有位置键。当我使用\"location\":\".*\", 时,这会找到location 的第一次出现并匹配文件中", 的最后一次出现。
  • sed 通常不太适合此类任务。一般来说,JSON 的重要处理最好使用支持 JSON 的语言或模块或工具来完成。

标签: json unix sed jq


【解决方案1】:

使用

.payload[].location |= gsub("/";"-")

或者,如果您希望检查每个“位置”键,无论键出现在何处:

walk(if type == "object" and (.location|type=="string") 
     then .location |= gsub("/";"-") else . end)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-30
    • 2011-05-28
    • 2018-10-06
    • 2022-11-23
    • 2015-02-03
    • 1970-01-01
    • 2013-10-24
    • 2015-01-04
    相关资源
    最近更新 更多