Come posso eliminare i caratteri tra in Perl?
Domanda
Ho bisogno di scrivere uno script Perl per leggere in un file, e cancellare qualche cosa all'interno <>, anche se sono su linee diverse. Cioè, se l'ingresso è:
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.
Voglio l'output di essere:
Hello, world. I ate a sandwich. bananas.
Io so come fare questo se il testo è il 1 linea con una regex. Ma io non so come si fa con più linee. In definitiva ho bisogno di essere in grado di eliminare in modo condizionale parti di un modello in modo da poter generare file parametrizzati per i file di configurazione. Ho pensato perl sarebbe una buona lingua, ma sto ancora ricevendo il blocco di esso.
Modifica : anche bisogno di più di 1 istanza di <>
Soluzione
local $/;
my $text = <>;
s/<.*?>//gs;
print $text;
Altri suggerimenti
Si consiglia di controllare un modulo Perl Text :: Balanced , parte della distribuzione principale. Penso che sarà di aiuto per voi. In generale, si vuole evitare espressioni regolari per fare questo genere di cose se il testo soggetto rischia di avere un set interno di delimitatori, si può ottenere molto disordinato.
In Perl:
#! /usr/bin/perl
use strict;
my $text = <>;
$text =~ s/<[^>]*>//g;
print $text;
L'espressione regolare sostituisce tutto ciò che inizia con un
EDIT: incorporato commenti da Hynek e il caos
Inefficace modo one-liner
perl -0777 -pe 's/<.*?>//gs'
stesso programma
local $/;
my $text = <>;
s/<.*?>//gs;
print $text;
Dipende quanto grande testo che si desidera convertire qui è più efficace uno-liner che consumano riga per riga
perl -pe 'if ($a) {(s/.*?>// and do {s/<.*?>//g; $a = s/<.*//s;1}) or $_=q{}} else {s/<.*?>//g; $a = s/<.*//s}'
stesso programma
my $a;
while (<>) {
if ($a) {
if (s/.*?>//) {
s/<.*?>//g;
$a = s/<.*//s;
}
else { $_ = q{} }
}
else {
s/<.*?>//g;
$a = s/<.*//s;
}
print;
}