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?
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:
Çü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
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
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'
,*,*,*,
s
veg
tırnak işaretlerinin dışına?)