使用 sed 替换文件中的版本号

使用 sed 替换文件中的版本号

我需要更新文件中的版本号。该文件中有一行包含语义版本号,如下所示:

foo.bar.blah.blub#10.6.1

现在我想查找前缀“blah.blub”来标识正确的行并替换版本号。

我得到的以下内容显然不起作用:

sed -i -e 's/^blah.blub#\d\.\d\.\d$/blah.blub'${VERSION}/$ README.MD

答案1

Sed 默认使用基本正则表达式,大多数实现(包括您似乎正在使用的 GNU 实现)都不理解\d。另外,您的行不以 开头blah.blub,因此^意味着它永远不会匹配。以及其他各种问题。

这应该可以满足您的需要:

sed -i -E "/blah\.blub#/s/#.*/#$VERSION/" README.MD

这会将 a 之后的文本替换#为 的内容$VERSION,但前提是该行包含blah.blub。现在,我不知道这是否足够具体来处理您的数据,因为您只向我们展示了这一行。

答案2

-i\dperl特征。在某些sed实现中,添加了其中一个或两个(如 ast-open 的)功能,但无论如何,这两个功能都不在命令的标准规范中,sed并且不可移植。

在这里,你不妨使用真实的东西:

export VERSION
perl -pi -e 's/^([\w.]*\.)?blah\.blub#\K\d+\.\d+\.\d+$/$ENV{VERSION}/' README.MD

这里允许0个或多个可选序列单词字符或点,以 之前的点结尾blah.bluh,并且原始版本号的 3 个组成部分中的每一个都允许多于一位数字。

我们还通过环境变量而不是在代码表达式中传递新版本字符串,这使其更安全(避免任意代码注入漏洞)且更可靠(允许新版本文本中的任何字符甚至字节值) 。

相关内容