我正在使用的命令是
sed -i "s/01.00.*/${version}/g" file.json
结果:"${version}
预期的"${version}"
例子:
"params": {
"pipeline_branch":"master",
"git_repo_url":"blah.git",
"ARTIFACTORY_TAR_VERSION" : "01.00.00.26"
}
我希望能够 sed 并将 01.00.00.26 值(或任何不断变化的 01.00.* ,通常是 pom version )替换为通过 shell 检索的“${version}”值。
我打算通过 Jenkins 作业在 Linux 上运行它。我使用的命令sed
(几乎)完美地工作,但删除了最后的双引号。
答案1
您的 sed 命令的问题是它匹配太多。让我们看看这个模式,然后将其分解:
/01.00.*/
01 # exact match (so far, so good)
. # any character (too generous)
00 # exact match
.* # the rest of the line
我们要匹配的01.00.
后面是任意数量的数字和点:
/01\.00\.[.0-9]*/
请注意,我们使用\.
点来匹配,而不是.
匹配任何单个字符。
答案2
相关行是这一行
"ARTIFACTORY_TAR_VERSION" : "01.00.00.26"
有几个选项:您可以要求"ARTIFACTORY_TAR_VERSION"
出现在行上,然后替换看起来像版本号的东西,或者您可以不那么谨慎,只替换看起来像版本号的任何东西。
此选项将替换任何看起来像包含01.00.
数字和点的版本号的内容:
sed -i "s/01\.00\.[0-9.]*/${version}/g" file.json
这将模式限制为双引号(请注意,我在 RE 中途从单引号切换到双引号保护,以防止 shell 解释模式):
sed -ri 's/(")[[:digit:].]*"/'"\1${version}\1/g" file.json
最后一个还要求模式仅匹配VERSION
其中某处包含该单词的行:
sed -ri '/VERSION/s/(")[[:digit:].]*"/'"\1${version}\1/g" file.json
不要忘记,为了测试您不一定需要修改文件就地。您可以省略该-i
标志并检查输出,而无需更改源文件。
答案3
sed -i "s/01.00.*\"/\${version}\"/g" file.json
搜索该行直到 -- s/01.00.*\"/ 替换为 -- /${version}\"/