sed 找到 01.00.* 并替换为 ${version}

sed 找到 01.00.* 并替换为 ${version}

我正在使用的命令是

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}\"/

相关内容