在VI中搜索和替换正则表达式,需要澄清

时间:2012-06-01 18:10:31

标签: 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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

在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