我需要写一个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.

我知道如何做到这一点,如果文本是与正则表达式1线。但我不知道如何与多条线路做。 最后,我需要能够有条件地删除模板的一个部分,所以我可以生成配置文件参数化文件。我想perl的将是一个很好的语言,但我仍然得到了它的窍门。

修改:也需要超过1个实例<>

有帮助吗?

解决方案

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

其他提示

您可能想看看Perl模块文本::平衡,部分核心分布。我认为这将是对你的帮助。一般情况下,一个人想避免正则表达式做那种事情,如果主题文本可能有内部设置的分隔符,它可以变得非常混乱。

在Perl的:

#! /usr/bin/perl   
use strict;

my $text = <>;
$text =~ s/<[^>]*>//g;
print $text;

在正则表达式替换任何开始以<通过第一>(含),并与没有替换它。该g是全局的(一次以上)。

编辑:从希内克和混乱并入评论

无效单行方式

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;
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top