2015-04-12 17 views
5

Tôi đã xem xét cố gắng làm việc này trong một số ngày nhưng tôi bị kẹt.Gặp sự cố khi tìm kiếm và thay thế bằng JSON của tôi bằng cách sử dụng jq

Tôi có cấu trúc dữ liệu json với các giá trị trong đó tôi muốn cập nhật, về cơ bản sử dụng json của tôi làm cơ sở dữ liệu để lưu trữ các giá trị cấu hình. Dưới đây là JSON của tôi:

{ 
    "Actions": [ 
    { 
     "Number": 1012, 
     "RollbackPoint": "xxx_1012_RollbackPoint_xxx", 
     "Parameters": [ 
     { 
      "Name": "accountType", 
      "Value": "xxx_1012_accountType_xxx" 
     }, 
     { 
      "Name": "userPassword", 
      "Value": "xxx_1012_userPassword_xxx" 
     } 
     ] 
    }, 
    { 
     "Number": 1015, 
     "RollbackPoint": "xxx_1015_RollbackPoint_xxx", 
     "Parameters": [ 
     { 
      "Name": "accountType", 
      "Value": "xxx_1015_accountType_xxx" 
     }, 
     { 
      "Name": "skipExport", 
      "Value": "xxx_1015_skipExport_xxx" 
     } 
     ] 
    } 
    ] 
} 

Tôi muốn thực hiện hai bản cập nhật

  1. Cập nhật RollbackPoint tới "1012", nơi Số = 1015
  2. Cập nhật giá trị cho "AWS" nơi name = "accountType" dưới thông số, nơi Số = 1012

cho đến nay gần nhất tôi có được để sử dụng này:

cat json.txt | jq '.[] | map(. + {RollbackPoint:(if (."Number") == 1015 then "1015" else .RollbackPoint end)})' 

Nhưng điều này dải off the Actions [] yếu tố để nó không tốt cho tôi, tôi không biết được nơi để thậm chí bắt đầu từ ngày cập nhật 2 ...

Bất kỳ trợ giúp sẽ được đánh giá rất nhiều, hơn 5 tiếng đồng hồ trên google và tôi vẫn không ở đâu gần.

Rất cám ơn Matt

Trả lời

8

Bạn có thể tận dụng các nhà điều hành // để bắt chước (IMHO) đẹp hơn if-else cây kết hợp với bộ lọc lọc khác nhau. Làm cho nó khá dễ dàng để làm theo, so với một cây nếu lớn khác.

.Actions |= map(
    (select(.Number == 1015) | 
     .RollbackPoint = "1012" 
    ) // 
    (select(.Number == 1012) | 
     .Parameters |= map((select(.Name == "accountType") | .Value = "AWS") // .) 
    ) // 
    . 
) 
+0

Perfect! Cảm ơn bạn rất nhiều Jeff hoạt động như một sự quyến rũ. Tôi có thể thấy tôi sử dụng tất cả các nơi này ngay bây giờ. Trân trọng Matt – msmithwr

+0

@msmithwr Rất vui khi bạn tìm thấy giải pháp của mình. Vui lòng đánh dấu câu trả lời của Jeff là được chấp nhận, để giúp những người dùng khác. – Synesso

0

Dưới đây là một giải pháp JQ

.Actions[] |= (
     if .Number == 1015 then .RollbackPoint = "1012" else . end 
    | if .Number == 1012 then .Parameters[] |= (
     if .Name == "accountType" then .Value = "AWS" else . end 
    ) else . end 
) 
Các vấn đề liên quan