我正在尝试使用以下 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