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 <>

È stato utile?

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 (compreso) e lo sostituisce con nulla. La g è globale (più di una volta).

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top