如何使用 SED 将正则表达式捕获的版本号替换为另一个版本号?

如何使用 SED 将正则表达式捕获的版本号替换为另一个版本号?

我正在尝试使用以下 sed 命令:

sed 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' test.txt

来替换的内容test.txt

shared:core:0.0.2

我期望它成为

shared:core:1.1.1

但什么也没发生。我想我需要一些关于 sed 如何工作的提示

答案1

你正在使用(foo)这意味着捕获字符串foo。但是,默认情况下,sed会将其读取为文字,(后跟foo另一个),并且由于您的输入中没有任何(),因此永远不会匹配。

sed使用捕获括号,您不需要转义它们(\(foo\)) 或者您需要使用-E.但实际上你在这里根本不需要这个,因为你从来没有提到你试图捕捉的东西。所有你需要的是:

$ sed 's/shared:core:.*/shared:core:1.1.1/' file 
shared:core:1.1.1

甚至:

$ sed -E 's/(shared:core:).*/\1:1.1.1/' file 
shared:core::1.1.1

或者更简单:


$ sed -E 's/(.*):.*/\1:1.1.1/' file 
shared:core:1.1.1

现在,如果您的输入更复杂,并且您想要匹配的是 1-4 个数字的 1 到 5 次重复,然后是 1 到 6 次重复。后跟 1 到 6 个字母数字字符(这是您使用的正则表达式的作用),您可以使用您的版本,只需添加-E(假设您的sed实现支持它):

$ sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' file 
shared:core:1.1.1

或者,如果您不能使用-E

$ sed  's/shared:core:\([0-9]\{1,4\}\(\.[0-9a-z]\{1,6\}\)\{1,5\}\)/shared:core:1.1.1/' file 
shared:core:1.1.1

虽然我担心这可能不是 100% 便携,但不确定。

最后,请记住,sed除非您提供该-i选项,否则不会更改输入文件。因此,如果您希望原始文件发生更改,请使用sed -i .... file.

答案2

默认情况下,sed使用基本正则表达式。添加-E扩展正则表达式的选项。因此:

sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' test.txt

或者,转换为基本正则表达式。因此:

sed 's/shared:core:\([0-9]\{1,4\}\(\.[0-9a-z]\{1,6\}\)\{1,5\}\)/shared:core:1.1.1/' test.txt

此外,如果您确实希望更改文件的内容,那么您需要添加该-i选项,以引起“就地”更改。因此:

sed -E 's/shared:core:([0-9]{1,4}(\.[0-9a-z]{1,6}){1,5})/shared:core:1.1.1/' -i test.txt

相关内容