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

  • 本文关键字:修改 属性 jq 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属性的当前值。

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

使用map的简洁解:

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

或更一般地:

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

更简洁:

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

等等……

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

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

(你可以去掉"^"但它使意图非常清楚。)

一般:

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

遍历数组,替换每个元素的" id ";用一个新值。在这种情况下,将原始值的类型转换为数字,添加1亿并转换回字符串。

也就是说

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

最新更新