Comment puis-je supprimer des caractères entre en Perl?
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 <>
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;
}