Question

Je dois écrire un script Perl pour lire dans un fichier, et de supprimer quoi que ce soit à l'intérieur de <>, même si elles sont sur des lignes différentes. Autrement dit, si l'entrée est:

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.

Je veux que la sortie soit:

Hello, world. I ate a sandwich. bananas.

Je sais comment faire si le texte est sur 1 ligne avec une expression régulière. Mais je ne sais pas comment le faire avec plusieurs lignes. En fin de compte, je dois pouvoir supprimer conditionnellement parties d'un modèle afin que je puisse générer des fichiers paramétrées pour les fichiers de configuration. Je pensais que Perl serait une bonne langue, mais je reçois toujours le coup de lui.

Modifier : Il faut aussi plus de 1 instance de <>

Était-ce utile?

La solution

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

Autres conseils

Vous pouvez consulter un module Perl Text :: équilibré, une partie de la distribution de base. Je pense que ce sera de l'aide pour vous. En général, on veut éviter regexes de faire ce genre de chose si le texte soumis est susceptible d'avoir un ensemble intérieur de délimiteurs, il peut devenir très compliqué.

En Perl:

#! /usr/bin/perl   
use strict;

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

Le regex remplace tout ce qui commence par un <à travers le premier> (inclus) et le remplace par rien. Le g est global (plus d'une fois).

EDIT: commentaires incorporés de Hynek et le chaos

Inefficace façon one-liner

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

même que le programme

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

Cela dépend de la taille du texte que vous voulez convertir ici est plus efficace ligne consommer en une ligne par ligne

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

même que le programme

my $a;
while (<>) {
    if ($a) {
        if (s/.*?>//) {
            s/<.*?>//g;
            $a = s/<.*//s;
        }
        else { $_ = q{} }
    }
    else {
        s/<.*?>//g;
        $a = s/<.*//s;
    }
    print;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top