Como posso apagar caracteres entre em Perl?
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 <>
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
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;
}