显然,在使用.*$
的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"
基本上我需要替换一个位于新生成的文件中的特定参数值,并将一个参数值传递给脚本。我试图通过专注于错误来避免要求某人为我解决我的问题,但如果你有一个更好的解决方案,请告诉我。
答案 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"}