鉴于以下内容,我想评论以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中失败
答案 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