0

ファイル内の文字列置換中に解析するためのコメント行 (* で始まる行) を避けることができません。私のコードで私を助けてください。

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

Eclipse、Windows XPでPerlを使用しています。

次のエラー メッセージが表示されます。

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

前もってありがとう、Perl初心者

4

4 に答える 4

2

文字列が一致しない場合にのみ置換を行う必要があります。

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

また、Perl から Perl を呼び出そうとしているようです。これは通常、元のプログラム内からファイルを処理するよりも遅くなります。

于 2012-08-29T07:09:03.437 に答える
1

これを使用して、正規表現に一致する行をスキップします

perl -ne 'print unless /^\*/' filename
于 2012-08-29T07:53:06.457 に答える
0

nextコメントに一致する場合は、次のコードをスキップするために使用します。

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

更新:chorobaが提案したように、Perlの個別のインスタンスを起動して引用符を処理する代わりに、メインコードにすべてを含める必要があります。

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;

$func[5]can(潜在的に)にはメタ文字が含まれていることに注意してください。そのため、私はそれらをエスケープするために使用\Qしました。\E

\[\.\]*書かれているように角かっこ、ドット、および0個以上の閉じ角かっこ:、、、またはに一致する部分[.について[.]はよくわかりません[.]]。それはあなたが望んでいることではないと思います。

于 2012-08-29T07:12:43.723 に答える
0

コメントとして「*」で始まる行をスキップしようとする場合は、これを試してください。

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

次のようなファイルを処理する場合:

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

走る

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

あなたが得る

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

通常のコンテキストの AAA だけが置き換えられます。

于 2012-08-29T07:51:46.110 に答える