Regex 搜索并替换VI中的正则表达式,需要澄清

Regex 搜索并替换VI中的正则表达式,需要澄清,regex,vi,Regex,Vi,鉴于以下情况,我想对以1、2或3开头的行进行注释 Some text 1 101 12 1 102 13 2 200 2 // Some comments inside 2 202 4 2 201 7 3 300 0 3 301 7 Some other text 下面的正则表达式看起来不错,但它不起作用 %s/^([123])(.+)/#\1\2/g 当egrep使用时,相同的正则表达式匹配 egrep '^([123])(.+)' file_name 请帮助我理解为什么此搜索和替换在V

鉴于以下情况,我想对以1、2或3开头的行进行注释

Some text
1 101 12
1 102 13
2 200 2
// Some comments inside
2 202 4
2 201 7
3 300 0
3 301 7
Some other text
下面的正则表达式看起来不错,但它不起作用

%s/^([123])(.+)/#\1\2/g
当egrep使用时,相同的正则表达式匹配

egrep '^([123])(.+)' file_name

请帮助我理解为什么此搜索和替换在VI中失败

您需要转义字符:
()+
。所以你可以做
%s/^\([123]\)\(.\+\)/\35;\ 1\2/g
,但这似乎更容易:
:g/^[123]/s/^/\35;

请注意,vi确实有各种选项来更改模式中符号的含义(
help magic
)。特别是,您可以使用“非常神奇”并执行以下操作:
:%s/\v^([123].+)/\1/g
(请注意,
g
标志在Perl中是完全冗余的!)

my $t = "Some text
1 101 12
1 102 13
2 200 2
2 202 4
2 201 7
3 300 0
3 301 7
Some other text";

foreach (split /^/, $t) {
  $_ =~ s/^([1-3])/# $1/;
  print $_;
}
结果:

Some text
# 1 101 12
# 1 102 13
# 2 200 2
# 2 202 4
# 2 201 7
# 3 300 0
# 3 301 7
Some other text

FWIW,
egrep
使用不同的正则表达式语法(e表示扩展)。如果您使用
grep
它也不会起作用。谢谢Felix。我还保存了你发布的链接。这是一个好的