sed s/REGEXP/REPLACMENT/g の実行サイクル

sed s/REGEXP/REPLACMENT/g の実行サイクル

" "代わりに " echo ,,, |sed s':\(,\)\(,\):\1*\2:'g"が生成されるのはなぜですか?つまり、「g」フラグにもかかわらず、sedがカンマペアの間に ''を挿入しないのはなぜですか?,*,,,*,*,*

答え1

これは、2つの,sに対して(,\)\(,\)すでに最初の2つを一致させ、,これまで一致した正規表現パターンが残りの行を逆追跡しないためです。最後の1つだけが残っているので、途中で2番目の項目なしで,そのまま印刷されます。*

他の入力があると、希望の(グローバル、)応答が,得られます。g

% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,

答え2

問題の原因は次のとおりです。回答済み寄稿者: @heemayl

回避策sed(ここでGNUと仮定sed) - 一致するものが見つかるたびに再帰的にループします。

$ echo ,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,

$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,

POSIX的に:

$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/\1*\2/; ta'
,*,*,*,

またはperl

$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,

関連情報