2016-06-08 94 views
-1

我正在嘗試更新json結構中的「image_id」值。使用下面的命令,我該如何更新 「AMI-d8cf5cab」 到 「AMI-a4df7gah」 到目前爲止,我有這個JSON JQ查找替換值

cat cog.test.tfstate| jq -r '.modules[].resources[] | select(.type == "aws_launch_configuration") | select(.primary.attributes.name_prefix == "pmsadmin-lc-")' 




{ 
    "type": "aws_launch_configuration", 
    "primary": { 
    "id": "pmsadmin-lc-v47thk6rcrdgza6dujfzjatmju", 
    "attributes": { 
     "associate_public_ip_address": "false", 
     "ebs_block_device.#": "0", 
     "ebs_optimized": "false", 
     "enable_monitoring": "true", 
     "ephemeral_block_device.#": "0", 
     "iam_instance_profile": "cog-test-pmsadmin", 
     "id": "pmsadmin-lc-v47thk6rcrdgza6dujfzjatmju", 
     "image_id": "ami-d8cf5cab", 
     "instance_type": "t2.small", 
     "key_name": "cog-test-internal", 
     "name": "pmsadmin-lc-v47thk6rcrdgza6dujfzjatmju", 
     "name_prefix": "pmsadmin-lc-", 
     "root_block_device.#": "0", 
     "security_groups.#": "4", 
     "security_groups.1893851868": "sg-7ee7bf1a", 
     "security_groups.2774384192": "sg-e2e7bf86", 
     "security_groups.2825850029": "sg-86e6bee2", 
     "security_groups.3095009517": "sg-f4e7bf90", 
     "spot_price": "", 
     "user_data": "ed03ac6642af8c97562b065c0b37f211b58ad0a2" 
    } 
    } 
} 
+1

You sho試圖使用hello世界的例子,而不是已經需要> 80個字符的jq代碼來訪問感興趣的屬性。 – hek2mgl

回答

1

使用|=運營商分配給屬性:

jq -r '.modules[].resources[] | select(.type == "aws_launch_configuration") | select(.primary.attributes.name_prefix == "pmsadmin-lc-")| .primary.attributes.image_id |= "ami-a4df7gah" 
+0

有沒有一種方法可以直接在json文件中更新值? –

+0

不是我所知道的。 – hek2mgl

+1

@ hek2mgl - 如果您沒有注意到,jq常見問題(https://github.com/stedolan/jq/wiki/FAQ#general-questions)的一般問題部分中的第一個Q現在是「in放置「編輯。 – peak

-2

這個問題和(迄今爲止)只在我看來的答案遠遠不符合stackoverflow.com社區的質量預期,因此應該關閉。

除此之外,我不得不承認他們實際上讓我找到了我正在尋找的解決方案。

因此,大家在相同的情況下,這裏的實際工作,並沒有過多的水平滾動可讀的形式是hek2mgl's response

假設從問題的JSON片段是在cog.test.tfstate

jq_filter='. | select(.type == "aws_launch_configuration")' 
jq_filter+=' | select(.primary.attributes.name_prefix == "pmsadmin-lc-")' 
jq_filter+=' | .primary.attributes.image_id |= "ami-a4df7gah"' 

jq "${jq_filter}" cog.test.tfstate 

使用的樣本數據無助於發現實際變化,因此這裏是差異前/後:

diff cog.test.tfstate <(jq "${jq_filter}" cog.test.tfstate) 
13c13 
<  "image_id": "ami-d8cf5cab", 
--- 
>  "image_id": "ami-a4df7gah",