2015-06-24 15 views
31

Çok açık bir şeyi gözden kaçırdıysam; Sadece jq'u buldum ve çevreleyen verileri etkilemeden bir JSON değerini güncellemek için kullanmaya çalışıyorum.jq? Kullanarak bir json belgesindeki tek bir değeri nasıl güncelleştiririm?

Bir curl sonucunu jq içine pipetlemek istiyorum, bir değeri güncelleyin ve güncellenmiş JSON'u curl -X PUT numaralı numaraya pipetleyin.

curl http://example.com/shipping.json | jq '.' field: value | curl -X PUT http://example.com/shipping.json 

gibi bir şey Şimdiye kadar bir araya sed kullanarak, fakat jq içinde |= operatörün birkaç örnek baktıktan sonra ben bu gerekmez eminim kesmek ettik.

İşte bir JSON örneğidir - "local": false'u ayarlamak için jq'u nasıl kullanabilirim?

{ 
    "shipping": { 
    "local": true, 
    "us": true, 
    "us_rate": { 
     "amount": "0.00", 
     "currency": "USD", 
     "symbol": "$" 
    } 
    } 
} 

cevap

48

= işlecini kullanarak bir nesnenin değerlerini ayarlarsınız. |= ise bir değeri güncellemek için kullanılır. Bu ince ama önemli bir fark var. Filtrelerin içeriği değişir.

Bir özelliği sabit bir değere ayarlandığından, = işlecini kullanın.

.shipping.local = false 

Yalnızca bir özellik için değer belirlerken mutlaka bulunması gerekmez. Yeni değerleri kolayca bu şekilde ekleyebilirsiniz.

.shipping.local = false | .shipping.canada = false | .shipping.mexico = true 
+7

Gerçekten de, yalnızca komutun kısmi sözdizimini değil, tam komut satırı kullanımını gösteren tam bir örnek vermiş olsaydınız. :-( – MikeSchinkel

+0

@MikeSchinkel: Şunun gibi bir şey demek istiyorsun: curl http: // ... | jq '.shipping.local = false' | curl -X PUT http: // ... '? Veya belki de:' curl http: // ... | jq --arg prop yerel '.shipping [$ prop] = false' | curl -X PUT http: // ... 'Herkesin sorunlarını tahmin edemem ve kaşıklanmış çözümler sunamam her biri için, yapı taşlarını sadece bir çözüme götürürüm. –

+2

@JeffMercado Örnek olarak tam bir 'jq' komutunu kastettim, yani: 'jq' .shipping.local = false 'my-data Ayrıca, yorumumun tonu için özür dilerim, yeniden okuduğumu agresif olarak görüyorum ama bu benim niyetim değildi. – MikeSchinkel

İlgili konular