代码之家  ›  专栏  ›  技术社区  ›  rlbond

如何删除Perl中<和>之间的字符?

  •  5
  • rlbond  · 技术社区  · 15 年前

    我需要编写一个Perl脚本来读取文件,并删除<>中的任何内容,即使它们位于不同的行中。也就是说,如果输入是:

    Hello, world. I <enjoy eating
    bagels. They are quite tasty.
    I prefer when I ate a bagel to
    when I >ate a sandwich. <I also
    like >bananas.
    

    我希望输出为:

    Hello, world. I ate a sandwich. bananas.
    

    如果文本与regex在1行上,我知道如何执行此操作。但我不知道如何用多行来做。 最后,我需要能够有条件地删除模板的某些部分,以便为配置文件生成参数化文件。我认为Perl是一种好语言,但我仍然掌握着它的窍门。

    编辑 :还需要多个<>实例

    4 回复  |  直到 15 年前
        1
  •  4
  •   chaos    15 年前
    local $/;
    my $text = <>;
    s/<.*?>//gs;
    print $text;
    
        2
  •  6
  •   Danny    15 年前

    您可能需要签出一个Perl模块 Text::Balanced 核心分布的一部分。我想这对你有帮助。一般来说,如果主题文本可能有一组内部分隔符,则可能会变得非常混乱,人们希望避免正则表达式执行这种操作。

        3
  •  6
  •   brian d foy JRFerguson    15 年前

    在Perl:

    #! /usr/bin/perl   
    use strict;
    
    my $text = <>;
    $text =~ s/<[^>]*>//g;
    print $text;
    

    regex替换了从<到第一个>(包括首尾)开始的任何内容,并用Nothing替换它。G是全球性的(不止一次)。

    编辑:合并了海尼克和混沌的评论

        4
  •  1
  •   Hynek -Pichi- Vychodil Paulo Suassuna    15 年前

    单列线路失效

    perl -0777 -pe 's/<.*?>//gs'
    

    与程序相同

    local $/;
    my $text = <>;
    s/<.*?>//gs;
    print $text;
    

    这取决于您要在此处转换多大的文本是更有效的一行一行地使用

    perl -pe 'if ($a) {(s/.*?>// and do {s/<.*?>//g; $a = s/<.*//s;1}) or $_=q{}} else {s/<.*?>//g; $a = s/<.*//s}'
    

    与程序相同

    my $a;
    while (<>) {
        if ($a) {
            if (s/.*?>//) {
                s/<.*?>//g;
                $a = s/<.*//s;
            }
            else { $_ = q{} }
        }
        else {
            s/<.*?>//g;
            $a = s/<.*//s;
        }
        print;
    }