Dlaczego daje echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
„ ,*,,
” zamiast „ ,*,*,
”? Innymi słowy: dlaczego pomimo flagi „g” sed nie wstawia „ *
” między jedną parę przecinków?
Dlaczego daje echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
„ ,*,,
” zamiast „ ,*,*,
”? Innymi słowy: dlaczego pomimo flagi „g” sed nie wstawia „ *
” między jedną parę przecinków?
Odpowiedzi:
Ponieważ z dwóch ,
sw (,\)\(,\)
, już dopasowane dwa pierwsze ,
s a wzór Regex dopasowane do tej pory nie będzie wracać do końca linii. Została tylko jedna, która jest ostatnia, ,
dlatego właśnie została wydrukowana, ponieważ nie ma *
między nią drugiej, ostatniej.
Jeśli masz inne ,
dane wejściowe, otrzymasz pożądaną (globalną g
) odpowiedź:
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
Odpowiedź na pytanie została już udzielona przez @heemayl
Obejście problemu sed
(przy założeniu GNU sed
) - pętla rekurencyjnie, dopóki znalezione zostanie dopasowanie
$ 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'
,*,*,*,
Lub z perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
s
ig
wychodzić ze znaków cudzysłowu?)