¿Por qué echo ,,, |sed s':\(,\)\(,\):\1*\2:'gproduce " ,*,," en lugar de " ,*,*,"? En otras palabras: ¿por qué, a pesar de la bandera "g", no se inserta ' *' entre un par de comas?
¿Por qué echo ,,, |sed s':\(,\)\(,\):\1*\2:'gproduce " ,*,," en lugar de " ,*,*,"? En otras palabras: ¿por qué, a pesar de la bandera "g", no se inserta ' *' entre un par de comas?
Respuestas:
Debido a que con las dos ,s adentro (,\)\(,\), ya ha emparejado las dos primeras ,sy el patrón Regex emparejado hasta ahora no retrocederá para el resto de la línea. Ahora solo queda uno, que es el último, ,por lo tanto, solo imprimió como está sin ningún otro *medio, el segundo último.
Si tiene otra ,entrada, obtendrá la grespuesta deseada (global ):
% echo ,,,, | sed s':\(,\)\(,\):\1*\2:'g
,*,,*,
echo ,,,,, |sed s':\(,\)\(,\):\1*:’g
El por qué de la pregunta ya ha sido respondido por @heemayl
Solución alternativa con sed(aquí suponiendo GNU sed) - bucle recursivo siempre que se encuentre una coincidencia
$ echo ,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,
$ echo ,,,, | sed -E ':a s/(,)(,)/\1*\2/ ; ta'
,*,*,*,
POSIXY:
$ echo ,,,, | sed -e :a -e 's/\(,\)\(,\)/\1*\2/; ta'
,*,*,*,
O con perl
$ echo ,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,
$ echo ,,,, | perl -pe 's/,\K(?=,)/*/g'
,*,*,*,
sygsalir de las comillas?)