jq 根据属性的现有值修改值

时间:2021-02-22 23:16:08

标签: json jq

我有一组 JSON 对象,

[
  {
    "id": "100006578",
    "name": "Someone",
    "category": "frontend"
  },
  {
    "id": "100005436",
    "name": "Someone",
    "category": "backend"
  }
]

我想根据其现有值替换 id 字段的值。我想使用 id 字段的现有值 (100005436) 并根据现有值将其替换为新值 (200005436)。基本上,我只想替换现有值中字符串的第一个字符。输出应该像

[
  {
    "id": "200006578",
    "name": "Someone",
    "category": "frontend"
  },
  {
    "id": "200005436",
    "name": "Someone",
    "category": "backend"
  }
]

我尝试了很多东西。但仍然在与 jq 斗争。 我尝试过的最接近的逻辑选项是增加它 jq '.externalId|map(.id+100000000)' fileWithJsonObject 但它不起作用,因为它是一个字符串。

我真的发现很难获得可以采用现有值并仅替换其中特定部分的替换表达式。有很多关于堆栈溢出的答案都在谈论基于外部提供的值替换键的值,但我想获取现有值,修改它并替换它。 到目前为止,我去过的最近的是以下但不幸的是,它不完整: jq '.externalId|to_entries|map(if .id then sub(*regex*; *tostring*))' fileWithJsonObject

我正在寻找一种方法来获得正确的正则表达式,以及如何提供/使用 id 属性的当前值来替代。

3 个答案:

答案 0 :(得分:4)

<块引用>

替换字符串的第一个字符...

使用 map 的简洁解决方案:

map(.id |= "2" + .[1:])

或更一般地说:

map(.id |= (.[0:1]|tonumber+1|tostring) + .[1:])

更简洁:

[].id |= "2" + .[1:]

等等...

答案 1 :(得分:2)

<块引用>

我正在寻找一种方法来获得正确的正则表达式

.[].id |= sub("^."; "2")

(你可以去掉“^”,但它使意图非常明确。)

更一般地说:

.[].id |= (. as $id | sub("^."; $id[0:1] | tonumber+1 | tostring)

答案 2 :(得分:1)

通过数组映射,用新值替换每个元素的“id”。在这种情况下,将原始值的类型转换为数字,加上 1 亿并转换回字符串。

换句话说,

jq 'map( . + { "id": ( .id | tonumber + 100000000 ) | tostring } )'
相关问题