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

War es hilfreich?

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 (einschließlich) und ersetzt sie durch nichts. Die g ist weltweit (mehr als einmal).

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;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top