/ / Jak uniknąć wierszy komentarza podczas parsowania podczas wymiany ciągów w pliku? - wyrażenie regularne, perl

Jak uniknąć linii komentarza do parsowania podczas zamiany ciągów znaków w pliku? - regex, perl

Nie mogę uniknąć linii komentarza (linie zaczynające się od *) do analizowania podczas wymiany ciągu w pliku. Proszę, pomóż mi z moim kodem.

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

Używam Perla w Eclipse, Windows XP.

Otrzymuję następujący komunikat o błędzie:

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

Z góry dziękuję, Początkujący w Perlu

Odpowiedzi:

0 dla odpowiedzi № 1

posługiwać się next aby pominąć następujący kod, jeśli pasujesz do komentarza:

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

aktualizacja: teraz jak sugerowała choroba, zamiast odpalać osobną instancję Perla i mieć do czynienia z cudzysłowami, prawdopodobnie należy mieć całość w kodzie głównym:

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;

Zauważ, że $func[5] może (potencjalnie) zawierać metaznaki, więc użyłem Q i E uciec przed nimi.

Nie jestem pewien co do [.]* część, która zgodnie z zapisem pasuje do nawiasu kwadratowego, kropki i 0 lub więcej zamykających nawiasów kwadratowych: [., [.], lub [.]]. Podejrzewam, że nie tego chcesz.


2 dla odpowiedzi nr 2

Powinieneś dokonać zamiany tylko wtedy, gdy ciąg nie pasuje:

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

Wygląda na to, że próbujesz wywołać Perla z Perla. Jest to zwykle wolniejsze niż przetwarzanie pliku z poziomu oryginalnego programu.


1 dla odpowiedzi nr 3

Używam tego, aby pominąć wiersze pasujące do wyrażenia regularnego

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

0 dla odpowiedzi nr 4

Spróbuj tego, jeśli próbujesz pominąć wiersze zaczynające się od „*” jako komentarze:

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

Podczas przetwarzania takiego pliku:

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

biegać

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

dostaniesz

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

Tylko AAA w normalnym kontekście zostanie zastąpiony.