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 № 1benutzen 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.