在MacOS上编辑JSON参数文件

时间:2016-12-06 18:05:26

标签: regex bash macos sed

显然,在使用.*$的Unix环境中,将匹配任意数量的字符,直到行尾。

但是,使用

执行sed
"ParameterValue": ".*$" 

作为我在mac上的正则表达式,我得到了错误

  

sed:1:" s /" ParameterValue":"。* ...":正则表达式中未终止的替代

我希望它与"ParameterValue": "buildname"匹配,其中buildname可以是不同格式的三十个不同选项中的任何一个,从而阻止更准确的正则表达式。

脚本将始终从mac环境运行,所以我必须有一个可以在mac上运行的解决方案。

TL; DR:如何匹配bash 在mac 上的行尾?

修改 根据要求,我的脚本。出于安全原因,我只能显示此部分。 Image和grepname都在前面的行中定义。

REPLACE='"ParameterValue":.*'
REPLACETO='"ParameterValue": "${IMAGE}"'

grep -A 1 -i "RTSMImageTag" ${GREPNAME}_parameters.json | xargs sed -i '' -E "s/$REPLACE/$REPLACETO"

摘录相关文件;

"ParameterKey": "RTSMImageTag",
"ParameterValue": "buildname"

基本上我需要替换一个位于新生成的文件中的特定参数值,并将一个参数值传递给脚本。我试图通过专注于错误来避免要求某人为我解决我的问题,但如果你有一个更好的解决方案,请告诉我。

2 个答案:

答案 0 :(得分:4)

请勿使用grep。不要使用sed。使用jq

$ cat tmp.json
{
  "ParameterKey": "RTSMImageTag",
  "ParameterValue": "buildname"
}
$ jq --arg image "FOO" 'select(.ParameterKey == "RTSMImageTag") | .ParameterValue = $image' tmp.json
{
  "ParameterKey": "RTSMImageTag",
  "ParameterValue": "FOOO"
}

答案 1 :(得分:3)

使用Python:

# this is a shell function that wraps a short Python script
# usage: update_json key value <in.json >out.json
update_json() {
  python -c '
import sys, json
content = json.load(sys.stdin)
content[sys.argv[1]] = sys.argv[2]
json.dump(content, sys.stdout)
sys.stdout.write("\n")
' "$@"
}

此后:

update_json ParameterValue NewValue <<<'{"ParameterKey": "RTSMImageTag", "ParameterValue": "buildname"}'

......正确发出:

{"ParameterValue": "NewValue", "ParameterKey": "RTSMImageTag"}