/ / Wie vermeide ich die Kommentarzeilen für das Parsen beim Ersetzen von Zeichenfolgen in einer Datei? - Regex, Perl

Wie vermeidet man die Kommentarzeilen für das Parsing während der String-Ersetzung in einer Datei? - Regex, Perl

Ich kann die Kommentarzeilen (Zeilen, die mit * beginnen) für das Parsen beim Ersetzen von Zeichenfolgen in einer Datei nicht umgehen. Bitte helfen Sie mir mit meinem Code.

`perl -pi.bak -e "$_ =~/[#.*]*/; /s/PATTERN/REPLACEMENT STRING/g" Test.txt`;

Ich verwende Perl in Eclipse, Windows XP.

Ich erhalte folgende Fehlermeldung:

Number found where operator expected at -e line 6, near "*    LAST UPDATED 09/15"
(Might be a runaway multi-line // string starting on line 1)
(Missing operator before 15?)
Bareword found where operator expected at -e line 6, near "1994 AT"
(Missing operator before AT?)

Danke im Voraus, Perl Newbie

Antworten:

0 für die Antwort № 1

benutzen next Überspringen Sie den folgenden Code, wenn Sie mit einem Kommentar übereinstimmen:

perl -i.back -p -e"next if /^#/; s/PATTERN/REPLACEMENT STRING/" Test.txt

aktualisieren: Nun, wie es Choroba vorgeschlagen hat, sollten Sie, anstatt eine separate Instanz von Perl zu starten und sich mit Anführungszeichen befassen zu müssen, wahrscheinlich das Ganze in Ihrem Hauptcode haben:

my $file= "Test.txt";
my $bak= "$file.bak";

rename $file, $bak or die "cannot rename $file into $bak: $!";;

open( my $in,  "<", $bak)  or die "cannot open $bak: $!";
open( my $out, ">", $file) or die "cannot create $file: $!";

while( <$in>)
{ if( ! /^*/) # note the backslash here, * is a meta character
{ s/PERFORM Q$func[5]E[.]*/# PERFORM $func[5].n $hash{$func[5]}/g; }
print {$out} $_;
}
close $in;
close $out;

Beachten Sie, dass $func[5] Kann (möglicherweise) auch Metazeichen enthalten, habe ich also benutzt Q und E um ihnen zu entkommen.

Ich bin mir nicht sicher [.]* Teil, der wie geschrieben mit einer eckigen Klammer, einem Punkt und 0 oder mehr schließenden eckigen Klammern übereinstimmt: [., [.], oder [.]]. Ich vermute, das ist nicht das, was du willst.


2 für die Antwort № 2

Sie sollten den Ersatz nur dann durchführen, wenn die Zeichenfolge nicht übereinstimmt:

perl -pi.bak -e "s/PATTERN/REPLACEMENT STRING/g unless /^#/" Test.txt

Außerdem scheint es, dass Sie versuchen, Perl von Perl aus aufzurufen. Das ist normalerweise langsamer als das Verarbeiten der Datei in Ihrem ursprünglichen Programm.


1 für die Antwort № 3

Ich benutze dies, um die Zeilen zu überspringen, die dem regulären Ausdruck entsprechen

perl -ne "print unless /^*/" filename

0 für die Antwort № 4

Versuchen Sie dies, wenn Sie versuchen, Zeilen zu überspringen, die mit "*" als Kommentar beginnen:

perl -pi.bak -e "s/PATTERN/REPLACEMENT STRING/g unless /^*/" Test.txt

Bei der Bearbeitung einer Datei wie folgt vorgehen:

* this is a comments: AAA => BBB
AAA
AAB
ABB
BBB

Lauf

perl -pi.bak -e "s/AAA/BBB/g unless /^*/" Test.txt

Sie erhalten

* this is a comments: AAA => BBB
BBB
AAB
ABB
BBB

Es wird nur der AAA im normalen Kontext ersetzt.