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


14

echo ,,, |sed s':\(,\)\(,\):\1*\2:'g,*,,」ではなく「」が生成されるのはなぜ,*,*,ですか?言い換えれば、「g」フラグにもかかわらず、sed *が1組のコンマの間に' 'を挿入しないのはなぜですか?

回答:


14

の2つ,のsを使用する(,\)\(,\)と、最初の2つ,のsにすでに一致しており、これまでに一致したRegexパターンは、残りの行でバックトラックしません。現在は最後の1つだけが残っている,ため、最後*の2番目のものが間にないまま印刷されます。

,入力に別の入力がある場合、目的の(グローバルg)応答を取得します。

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

奇妙な引用とは何ですか?(なぜ引用符を残しsたり、g外したのですか?)
GnP

@GnPハハ、それはOPから継承しています。
-heemayl

またはecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

質問の理由はすでに@heemaylによって回答されています

回避策sed(ここではGNUを想定sed)-一致が見つかるまで再帰的にループします

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

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

POSIXly:

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

または perl

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

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.