sed 命令使用正则表达式替换主要次要版本号

sed 命令使用正则表达式替换主要次要版本号

我正在使用 Sed 来替换版本中的主要、次要和发行号。

就我而言:

版本=10.2.0.1(版本=主要.次要.发行版.内部版本号)

我不想改变内部版本号在这个版本号中。我只想使用sed命令更改主要、次要和版本。

现存的

version=10.20.0.1

我希望输出为version=11.21.2.1 (内部版本号不应更改(我的版本中的最后一部分))

我使用下面的命令

sed -i -r s/version=(.*)/version=11.21.2/g <filename>

它给出的输出为

version=11.21.2 

这不是我的要求。

答案1

兼容的sed命令是:

$ sed 's/version=[1-9]\+[0-9]*\.[0-9]\+\.[0-9]\+/version=11.21.2/' <<<'version=10.20.0.1'
version=11.21.2.1

或与:

sed 's/version=[1-9]\+[0-9]*\(\.[0-9]\+\)\{2\}/version=11.21.2/' <<<'version=10.20.0.1'

或与:

sed -E 's/version=[1-9]+[0-9]*(\.[0-9]+){2}/version=11.21.2/' <<<'version=10.20.0.1'

或者甚至像下面这样,如果版本 Major_number 也可以像次要部分和发布部分一样以 0 开头:

sed -E 's/version=([0-9]+\.){3}/version=11.21.2./' <<<'version=10.20.0.1'

答案2

我们必须在这里做出假设,版本字符串(字符串,而不是数字)由四个字段组成,以句点分隔。因此,只需将最后一个捕获到正则表达式的 LHS 中即可。

我还建议首先关注行开头version=,只触及字符后面的部分=。将正则表达式放在单引号中,这样\转义就不会被 shell 抢先转义。另外,您不需要在匹配项周围使用(and ),因为您不会保留它以供以后使用。

sed -i -r '/version=/s/=.*\.[0-9][0-9]*$/version=11.21.2/g' <filename>

在上面,我允许最后一个字段是多个数字字符。您可能想在其中放置任意字符,在这种情况下:

sed  -r '/version=/s/=.*\.([^.]*)$/=11.21.2.\1/g' <filename>

要将任意更改作为输入,请说:

newver=11.21.2
sed  -r '/version=/s/=.*\.([^.]*)$/='${newver}'.\1/g' <filename>

答案3

您如何期望您的命令知道要替换版本字符串的哪一部分?它将.*匹配该行的整个其余部分,因此所有内容都会被替换。

现在,您可以定义一个仅匹配您想要替换的三个数字的模式(这就是 α sнιn 在他的答案中以不同方式所做的事情),或者使用如下引用保留构建号:s/=.*(\..*)/=11.21.2\1/。匹配\.文字点,因此最后一个点及其后的所有内容都无法与第一个点匹配.*。因此,内部版本号将匹配(\..*);将其放入 中()可以使其在替换时可访问为\1

我添加这个答案是因为它对我来说比 α sнιη 答案中的正则表达式更容易。也许是品味问题。

相关内容