Perché echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
" ,*,,
" anziché " " produce ,*,*,
? In altre parole: perché, nonostante la bandiera "g", sed non inserisce ' *
' tra una coppia di virgole?
Perché echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
" ,*,,
" anziché " " produce ,*,*,
? In altre parole: perché, nonostante la bandiera "g", sed non inserisce ' *
' tra una coppia di virgole?
Risposte:
Perché con le due ,
s in (,\)\(,\)
, hai già abbinato le prime due ,
s e il modello Regex abbinato finora non tornerà indietro per il resto della linea. Ne rimane solo uno ora che è l'ultimo, ,
quindi è appena stampato come è senza alcun mezzo *
tra di esso il secondo ultimo.
Se ne hai un altro ,
in input, otterrai la g
risposta desiderata (globale, ):
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
Il perché della domanda ha già risposto a @heemayl
Soluzione con sed
(qui assumendo GNU sed
) - loop ricorsivamente finché viene trovata una corrispondenza
$ 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'
,*,*,*,
O con perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
s
eg
uscire dalle virgolette?)