Wie kann ich Zeichen zwischen in Perl löschen?
Frage
Ich brauche ein Perl-Skript zu schreiben, in einer Datei, und löschen Sie alles innerhalb von <> zu lesen, auch wenn sie auf verschiedenen Linien sind. Das heißt, wenn die Eingabe:
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.
Ich mag die Ausgabe sein:
Hello, world. I ate a sandwich. bananas.
Ich weiß, wie dies zu tun, wenn der Text auf 1 Zeile mit einem regex ist. Aber ich weiß nicht, wie es mit mehreren Linien zu tun. Letztlich muss ich in der Lage sein, bedingt Teile einer Vorlage zu löschen, damit ich parametrisierte Dateien für Konfigurationsdateien erzeugen kann. Ich dachte, Perl eine gute Sprache sein würde, aber ich bin immer noch den Dreh raus zu bekommen.
Bearbeiten : Auch muß mehr als 1 Instanz von <>
Lösung
local $/;
my $text = <>;
s/<.*?>//gs;
print $text;
Andere Tipps
Sie können einen Perl überprüfen Modul Text :: Balanced , Teil der Kernverteilung. Ich denke, es wird für Sie hilfreich sein. Generell will man reguläre Ausdrücke vermeiden, so etwas zu tun, wenn das Thema Text ist wahrscheinlich eine innere Reihe von Begrenzungszeichen haben, kann es sehr chaotisch.
In Perl:
#! /usr/bin/perl
use strict;
my $text = <>;
$text =~ s/<[^>]*>//g;
print $text;
Die Regex ersetzt alles, beginnend mit einem
EDIT: eingebaut Kommentare von Hynek und Chaos
Unwirksame Einzeiler Art und Weise
perl -0777 -pe 's/<.*?>//gs'
gleiche wie Programm
local $/;
my $text = <>;
s/<.*?>//gs;
print $text;
Es hängt davon ab, wie groß Text, den Sie konvertieren möchten hier ist effektiver Einzeiler raubend Zeile für Zeile
perl -pe 'if ($a) {(s/.*?>// and do {s/<.*?>//g; $a = s/<.*//s;1}) or $_=q{}} else {s/<.*?>//g; $a = s/<.*//s}'
gleiche wie Programm
my $a;
while (<>) {
if ($a) {
if (s/.*?>//) {
s/<.*?>//g;
$a = s/<.*//s;
}
else { $_ = q{} }
}
else {
s/<.*?>//g;
$a = s/<.*//s;
}
print;
}