xetra11 Asked: 2021-12-23 02:50:34 +0800 CST2021-12-23 02:50:34 +0800 CST 2021-12-23 02:50:34 +0800 CST 如何使用 SED 将正则表达式捕获的版本号替换为另一个版本号? 772 我正在尝试使用以下 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 一起使用的提示 shell sed 2 个回答 Voted David G. 2021-12-23T03:04:39+08:002021-12-23T03:04:39+08:00 默认情况下,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 Best Answer terdon 2021-12-23T03:23:35+08:002021-12-23T03:23:35+08:00 您正在使用(foo)which 意味着捕获字符串foo。但是,默认情况下,sed会将其读取为一个文字(,然后是foo另一个文字,)并且由于您的输入中没有任何(or ),因此永远不会匹配。 要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 次重复,然后是 a 的 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.
默认情况下,
sed
使用基本的正则表达式。添加-E
扩展正则表达式的选项。因此:或者,转换为基本正则表达式。因此:
此外,如果您确实希望更改文件的内容,则需要添加
-i
选项,以导致“就地”更改。因此:您正在使用
(foo)
which 意味着捕获字符串foo
。但是,默认情况下,sed
会将其读取为一个文字(
,然后是foo
另一个文字,)
并且由于您的输入中没有任何(
or)
,因此永远不会匹配。要
sed
使用捕获括号,您不需要转义它们(\(foo\)
)或者您需要使用-E
. 你实际上根本不需要这个,因为你从来没有提到你试图捕捉的东西。所有你需要的是:甚至:
或者更简单:
现在,如果您的输入更复杂,并且您要匹配的是 1-4 个数字的 1 到 5 次重复,然后是 a 的 1 到 6 次重复。后跟 1 到 6 个字母数字字符(这是您使用的正则表达式所做的),您可以使用您的版本,只需添加
-E
(假设您的sed
实现支持它):或者,如果您不能使用
-E
:虽然我担心这可能不是 100% 便携的,但不确定。
最后,请记住,除非您给它选项
sed
,否则不会更改输入文件。-i
因此,如果您希望更改原始文件,请使用sed -i .... file
.