簡體   English   中英

jq 根據屬性的現有值修改值

[英]jq modify value based on existing value of the attribute

我有一個 JSON 對象數組,

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

我想根據現有值替換 id 字段的值。 我想使用 id 字段的現有值(100005436)並根據現有值將其替換為新值(200005436)。 基本上,我只想替換現有值中字符串的第一個字符。 output 應該像

[
  {
    "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:]

ETC...

我正在尋找一種方法來獲得正確的正則表達式

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

(你可以去掉“^”,但它的意圖非常清楚。)

更普遍:

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

Map 通過數組,將每個元素的“id”替換為新值。 在這種情況下,將原始值的類型轉換為數字,加上 1 億並轉換回字符串。

換句話說,

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM