修正する:
- Stephaneはここでこの複数行の質問に対する実際の答えを提供します。https://unix.stackexchange.com/a/521560/354415
- または、TerdonのPerlを使用して、次の行を1行ずつ確認します。https://unix.stackexchange.com/a/521512/354415
- または、ここで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")