我没有使用bash的经验,我必须更新一个小脚本,以使用常见模式从JSON中的所有值中删除子字符串/development/dev/。我从GetParametersByPath(AWS服务(得到了这样的东西:
{
"Parameters": [
{
"Name": "/development/dev/var1",
"Type": "String",
"Value": "Saanvi Sarkar",
"Version": 1
},
{
"Name": "/development/dev/var2",
"Type": "String",
"Value": "Zhang Wei",
"Version": 1
},
{
"Name": "/development/dev/var3",
"Type": "String",
"Value": "Alejandro Rosalez",
"Version": 1
},
]
}
我想删除子字符串"/development/dev/";用于所有Name值。
这就是我现在拥有的
// parameter_store_path has the value "/development/dev/"
jq_actions=$(echo -e ".Parameters | .[] | [.Name, .Value] | 42(.[0])=(.[2]) 42 | sub( 42${parameter_store_path}/ 42; 42 42)")
// function that returns the JSON
aws ssm get-parameters-by-path
--path $parameter_store_path
--with-decryption
--region eu-west-2
| jq -r "$jq_actions" >> /opt/elasticbeanstalk/deployment/custom_env_var
cp /opt/elasticbeanstalk/deployment/custom_env_var /opt/elasticbeanstalk/deployment/env
#Remove temporary working file.
rm -f /opt/elasticbeanstalk/deployment/custom_env_var
#Remove duplicate files upon deployment.
rm -f /opt/elasticbeanstalk/deployment/*.bak
我读了一些关于bash的文档,发现我可以使用${FOO#prefix}替换部分字符串,但我不知道如何在这段代码中实现它。
您似乎已经知道如何在jq
中执行替换。只需稍微多做一点。
aws ssm get-parameters-by-path
--path "$parameter_store_path"
--with-decryption
--region eu-west-2 |
jq -r '.Parameters | .[] |
"(.Name | sub("/development/dev/"; ""))=(.Value)"'
(下标[2]
在这里没有意义——我猜你指的是[1]
。然而,无论如何,下标似乎是多余的;我进行了重构以简化它,并仅在Name
上应用替换。也许还可以在Value
周围添加双引号?(
演示:https://jqplay.org/s/o7Exg4Ns6BU
如果您想将路径作为变量传递,请尝试
jq --arg path "/development/dev/"
-r '.Parameters | .[] |
"(.Name | sub($path; ""))="(.Value)""'
演示:https://replit.com/@tripleee/aws jq演示#main.sh
这也消除了echo -e
的无用使用。在这种特殊情况下,我只是换成了单引号而不是双引号(不过请注意,它们做的事情略有不同-通常更喜欢单引号,除非您需要在字符串中执行命令替换或变量替换,或者它需要包含文字单引号。Bash还为$' 47C-style 47 strings'
提供了类似于echo -e
中的反斜杠解释功能-该示例演示了如何将文字单引号与octal逃离