jq

2015-04-21 5 views
9

kullanarak dicts dizisinde bir değer güncelleştirin Bir dict değerinde bir değeri güncellemek istiyorum, ki bu yalnızca dict içindeki başka bir değerle tanımlayabilirim. Umarım bu işe buldukjq

[ 
    { 
    "format": "geojson", 
    "id": "foo" 
    }, 
    { 
    "format": "geojson", 
    "id": "bar" 
    }, 
    { 
    "format": "csv", 
    "id": "baz" 
    } 
] 

: Ben csv ' 'formatında eşlik s' baz değiştirmek istediğiniz

[ 
    { 
    "format": "geojson", 
    "id": "foo" 
    }, 
    { 
    "format": "geojson", 
    "id": "bar" 
    }, 
    { 
    "format": "zip", 
    "id": "baz" 
    } 
] 

: Yani, bu girdi verilir

jq 'map(if .id=="baz" then .format="csv" else . end)' my.json 

Ama Bu oldukça ayrıntılı görünüyor, bu yüzden bunu ifade etmek için daha zarif bir yol olup olmadığını merak ediyorum. jq bir çeşit ifade seçici eksik gibi görünüyor, xpath [@id='baz'] eşdeğeri olabilir.

(Bu soruyu başladığımda ben map keşfetti, sonra [.[] |...] vardı, yüzden ben sandığı kadar kötü değil.)

cevap

11

Karmaşık atama aradığınız budur:

jq '(.[] | select(.id == "baz") | .format) |= "csv"' my.json 

Belki de daha kısa değil ama talep edildiği gibi daha zarif. http://stedolan.github.io/jq/manual/#Assignment

Düzenleme: map kullanarak:

jq 'map((select(.id == "baz") | .format) |= "csv")' my.json 
+0

Ah ha az docs son bölümüne bakın. Bence gereksiz boru var (sanırım). Yani şöyle olabilir: 'jq '(. [] | Select (.id ==" baz ") .format) | =" csv "' my.json' –

+0

Başka bir varyasyon:' map (select (.id == ") corangamite ") biçim | =" csv ") –

+0

evet, iyi bir; 'Map' kullanarak bir varyant ekledim; Ihmal edilmiş boru ile notasyon hakkında emin değilim –