我需要更新文件中的版本号。该文件中有一行包含语义版本号,如下所示:
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
和\d
是perl
特征。在某些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 个组成部分中的每一个都允许多于一位数字。
我们还通过环境变量而不是在代码表达式中传递新版本字符串,这使其更安全(避免任意代码注入漏洞)且更可靠(允许新版本文本中的任何字符甚至字节值) 。