【问题标题】:Search and replace regex in VI, clarification needed在 VI 中搜索和替换正则表达式,需要说明
【发布时间】:2012-06-06 23:46:47
【问题描述】:

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

【问题讨论】:

  • FWIW,egrep 使用不同的正则表达式语法(e 代表扩展)。如果你使用grep,它也不会起作用。
  • 谢谢菲利克斯。我也保存了您发布的链接。不错lagmonster.org/docs/vi.html#re

标签: regex vi


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在 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
    

    【讨论】:

      猜你喜欢
      • 2013-07-13
      • 1970-01-01
      • 1970-01-01
      • 2013-06-14
      • 2022-11-26
      • 2018-11-10
      • 1970-01-01
      • 2018-05-25
      相关资源
      最近更新 更多