¿Cómo puedo borrar los caracteres entre en Perl?
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 <>
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;
}