Perl 複数行マッチ「#\s」で始まる「何か」

Perl 複数行マッチ「#\s」で始まる「何か」

修正する:

  1. Stephaneはここでこの複数行の質問に対する実際の答えを提供します。https://unix.stackexchange.com/a/521560/354415
  2. または、TerdonのPerlを使用して、次の行を1行ずつ確認します。https://unix.stackexchange.com/a/521512/354415
  3. または、ここでIFSを1行ずつ使用します。https://unix.stackexchange.com/a/521550/354415

これは私の新しいおもちゃです。

問題は、パラメータの前に #\s* がない行だけを一致させたいと思うことです。

sedなどの代替コードを提供しないでください。パールを使って

perl -we 'my $file= "parameter=9
# parameter=10
parameter=10
"; $file=~ s/.*((?<!^# ))parameter\s*=.*/parameter=replaced/g; print(":$file:\n")'

期待される出力

parameter=replaced
# parameter=10
parameter=replaced

PS:私の進捗状況を確認したい場合は、ここを見てください。可変長バイパス Perl Negative Lookbehindは可能ですか?

ベストアンサー1

複数行の文字列を単一の変数として渡すことを選択したため、これは複雑です。配列に変換する方がはるかに簡単なので、s///最も単純な形式で演算子を使用できます。これを試してみてください:コードの改善に興味がないと言われましたが、将来のユーザーを助けるためにここに書いたものの簡略化されたバージョンがあります。これはまた、非環境変数にALLCAPSを使用する悪い習慣を防ぎます。

newparameter='parameter=replaced'
filesection='
   parameter=9
# parameter=10
parameter=10
'

matchparamperl='^([^#]*)parameter\s*=.*'

sectionfixed=$( perl -le '
                         @lines=split(/\n/,$ARGV[0]);
                         s/$ARGV[1]/$1$ARGV[2]/g for @lines; 
                         print join "\n", @lines
                         ' "$filesection" "$matchparamperl" "$newparameter") 
echo "$sectionfixed"

これにより、次のものが返されます。

$ echo "$sectionfixed"

   parameter=replaced
# parameter=10
parameter=replaced

またはより短く:

sectionfixed=$( perl -le '
                         do{
                            s/$ARGV[1]/$1$ARGV[2]/g; print
                         } for split(/\n/,$ARGV[0])
                         ' "$filesection" "$matchparamperl" "$newparameter")

おすすめ記事