この簡単なコードがあります
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 Onelinerで実装しました!とても良い!