可変長バイパスによる Perl 否定後読みでしょうか?

可変長バイパスによる Perl 否定後読みでしょうか?

私はこの簡単なコードを持っています

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

そして、すべてのパラメータ=10を置き換えたいのですが、その行のどこかにハッシュが付いている場合は置き換えません。例:

        #    parameter=10
#    parameter=10
# parameter=10
        parameter=replaced
parameter=replaced

私は、

((?<!#\s*))

エラーが発生します

正規表現では可変長の後読みが実装されていない

では、他の方法でタスクを実行する方法はありますか?

ありがとう

答え1

次のようなことができます:

s/#.*|((?<!\S)parameter\h*=.*)/$1 ? "parameter=replaced" : $&/ge;

考え方としては、#.*(それ自体で置き換えます) がすべてのコメントを食い尽くすというものです。そして、交替の 2 番目の部分では、parameter=...残ったものの中からパターンを探します (ここでは、その前に非空白文字が付いていないことが条件です)。

別の方法としては、次の方法があります。

s/^[^#\n]*\K(?!<\S)parameter\h*=.*/parameter=replaced/gm;

\K置換する部分の開始を設定します。フラグは、件名内のすべての行の先頭で一致をm作成します。^

parameter=これらが行の先頭にのみ存在する場合(その後にオプションの空白が続く場合)、次のようになります。

s/^\h*\Kparameter\h*=.*/parameter=replaced/gm;

答え2

さて、私が思いついた唯一の代替案は次のとおりです。

FILESECTION="\
        #    parameter=10
#    parameter=10
#  parameter=10
        parameter=10
parameter=10
"

newfile=''
while IFS= read -r line ; 
    do 

    SECTIONFIXED=$( perl -le '$file=$ARGV[0]; $file=~ s/^(?!#+$)(\s*)(parameter\s*=.*)/parameter=replaced/g; print("$file\n");' "${line}" ; ) 
    newfile=$( printf "${newfile}\n${SECTIONFIXED}\n" )  
done <<< "$FILESECTION"

echo "$newfile" 

出力:

        #    parameter=10
#    parameter=10
#  parameter=10
parameter=replaced
parameter=replaced

'^(?!#+$)(\s*)'行ごとにネガティブ先読みを使用する必要があります。また、可変長を受け入れます (複数行の文字列ではないためでしょうか? まだわかりません)。

私はこのアイデアに出会ったhttps://www.regextester.com/95226そしてついにそれが実現しました。

今日は何か新しいことを学びました。これが役に立つことを願っています!

PS.([^#]*)提案されたように、シンプルなものを使用することもできますテルドン https://unix.stackexchange.com/a/521512/354415基本的にここでと同じ概念を提案しましたが、Perl ワンライナーで実装しました。とても素晴らしいです。

関連情報