Sed s / REGEXP / REPLACEMENT / g yürütme döngüsü


14

Neden echo ,,, |sed s':\(,\)\(,\):\1*\2:'g" ,*,," yerine " ,*,*," verir? Başka bir deyişle: "g" bayrağına rağmen, neden sed *bir çift virgül arasına ' ' eklemiyor?

Yanıtlar:


14

Çünkü iki ,s ile (,\)\(,\), ilk iki ,s ile zaten eşleştirdiniz ve şimdiye kadar eşleşen Regex deseni, hattın geri kalanı için geri gitmeyecek. Şimdi sadece bir tane kaldı, bu sonuncusu , aralarında ikinci sonuncusu ,olmadan olduğu gibi basıldı *.

Girdinizde başka bir ,girişiniz varsa, istediğiniz (genel g) yanıtı alırsınız :

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

Garip alıntı ne? (Neden izni sve gtırnak işaretlerinin dışına?)
GSMH

@GnP Haha, OP'den miras kaldı.
heemayl

veyaecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot

8

Neden sorunun zaten edilmiş cevap @heemayl tarafından

sed(Burada GNU olduğu varsayılır sed) ile geçici çözüm - bir eşleşme bulunduğu sürece yinelemeli olarak döngü

$ 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'
,*,*,*,

Veya ile perl

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

$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.