Pergunta

Eu preciso escrever um script Perl para ler em um arquivo, e nada dentro de exclusão <>, mesmo se eles estiverem em linhas diferentes. Ou seja, se a entrada é:

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.

Eu quero que a saída seja:

Hello, world. I ate a sandwich. bananas.

Eu sei como fazer isso se o texto está em 1 linha com um regex. Mas eu não sei como fazê-lo com várias linhas. Em última análise, eu preciso ser capaz de partes condicionalmente exclusão de um modelo para que eu possa gerar arquivos parametrizada para arquivos de configuração. Pensei perl seria uma linguagem bom, mas eu ainda estou recebendo o jeito dele.

Editar : precisa também mais de 1 instância de <>

Foi útil?

Solução

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

Outras dicas

Você pode querer verificar um módulo Perl Text :: Equilibrado , parte da distribuição do núcleo. Eu acho que vai ser de grande ajuda para você. Geralmente, se quer evitar expressões regulares para fazer esse tipo de coisa, se o texto do assunto é susceptível de ter um conjunto interior de delimitadores, ele pode ficar muito confuso.

Em Perl:

#! /usr/bin/perl   
use strict;

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

A substitutos regex nada começando com um (inclusive) e substitui-lo com nada. O g é global (mais de uma vez).

Editar: incorporada comentários de Hynek e caos

ineficaz one-liner maneira

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

mesmo programa

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

Depende de como texto grande você quer convertido aqui é consumir linha one-liner mais eficaz por linha

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

mesmo programa

my $a;
while (<>) {
    if ($a) {
        if (s/.*?>//) {
            s/<.*?>//g;
            $a = s/<.*//s;
        }
        else { $_ = q{} }
    }
    else {
        s/<.*?>//g;
        $a = s/<.*//s;
    }
    print;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top