我正在使用 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нιη 答案中的正则表达式更容易。也许是品味问题。