从bash脚本中检索到的json中删除子字符串



我没有使用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; 4242)")
// 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-style47 strings'提供了类似于echo -e中的反斜杠解释功能-该示例演示了如何将文字单引号与octal逃离47(。

只有当Bash变量中已经有一个字符串时,参数扩展才真正有意义。

下面是对脚本的重构,它也避免了奇怪的cp+rm,而使用了简单的mv。我猜您在脚本的早期向目标文件中写入了其他内容,这就是为什么要从jq中附加这些值。

#!/bin/bash
parameter_store_path="/development/dev/"
aws ssm get-parameters-by-path 
--path "$parameter_store_path" 
--with-decryption 
--region eu-west-2 |
jq --arg path "$parameter_store_path" 
-r '.Parameters | .[] |
"(.Name | sub($path; ""))="(.Value)""
' >> /opt/elasticbeanstalk/deployment/custom_env_var
mv /opt/elasticbeanstalk/deployment/custom_env_var /opt/elasticbeanstalk/deployment/env
rm -f /opt/elasticbeanstalk/deployment/*.bak

最新更新