Как я могу удалить символы между <и> в Perl? - PullRequest
5 голосов
/ 10 апреля 2009

Мне нужно написать 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 экземпляра <>

Ответы [ 4 ]

6 голосов
/ 10 апреля 2009

В Perl:

#! /usr/bin/perl   
use strict;

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

Регулярное выражение заменяет все, что начинается с <до первого> (включительно), и заменяет его ничем. Г является глобальным (более одного раза).

РЕДАКТИРОВАТЬ: включены комментарии от Hynek и хаос

6 голосов
/ 10 апреля 2009

Вы можете проверить модуль Perl Text :: Balanced , часть основного дистрибутива. Я думаю, что это поможет вам. Как правило, нужно избегать регулярных выражений, чтобы делать подобные вещи, если в предметном тексте, скорее всего, есть внутренний набор разделителей, он может стать очень запутанным.

4 голосов
/ 10 апреля 2009
local $/;
my $text = <>;
s/<.*?>//gs;
print $text;
1 голос
/ 10 апреля 2009

Неэффективный однострочный способ

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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...