Pregunta

Tengo que escribir un script en Perl para leer en un archivo y eliminar cualquier cosa dentro de <>, incluso si están en diferentes líneas. Es decir, si la entrada es:

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.

Quiero que la salida sea:

Hello, world. I ate a sandwich. bananas.

Yo sé cómo hacer esto si el texto es el 1 de acuerdo con una expresión regular. Pero no sé cómo hacerlo con varias líneas. En última instancia, tengo que ser capaz de eliminar de forma condicional partes de una plantilla para que pueda generar archivos parametrizados para los archivos de configuración. Pensé Perl es un buen lenguaje, pero todavía estoy recibiendo la caída de ella.

Editar : También necesitar más de 1 instancia de <>

¿Fue útil?

Solución

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

Otros consejos

Es posible que desee comprobar fuera de un módulo de Perl Texto :: Balanced , parte de la distribución de núcleo. Creo que va a ser de ayuda para usted. En general, se quiere evitar expresiones regulares para hacer ese tipo de cosas si el texto sujeto puede tener un conjunto interior de delimitadores, que puede ser muy complicado.

En Perl:

#! /usr/bin/perl   
use strict;

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

La expresión regular sustituye cualquier cosa que empiece con un (ambos inclusive) y lo reemplaza con nada. La g es global (más de una vez).

Edit: incorpora los comentarios de Hynek y el caos

ineficaz forma de una sola línea

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

Igual que el programa

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

Depende de lo grande de texto que desea convertir aquí es más efectivo de una sola línea que consume línea por línea

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

Igual que el programa

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