¿Por qué echo ,,, |sed s':\(,\)\(,\):\1*\2:'g
produce " ,*,,
" 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:'g
produce " ,*,,
" 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 g
respuesta 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'
,*,*,*,
s
yg
salir de las comillas?)