3

鉴于以下情况,我想评论以 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 中失败

4

2 回答 2

3

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

请注意,vi 确实具有用于更改模式中符号含义的各种选项 ( help magic)。特别是,您可以使用 'very magic' 并执行以下操作:(:%s/\v^([123].+)/#\1/g请注意,该g标志在这里完全是多余的!)

于 2012-06-01T18:18:01.763 回答
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
于 2012-06-01T18:22:21.297 回答