
私はこの簡単なコードを持っています
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 ワンライナーで実装しました。とても素晴らしいです。