Ciclo de ejecución de sed s / REGEXP / REPLACEMENT / g

14

¿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?

usuario3143179
fuente

Respuestas:

14

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
,*,,*,
heemayl
fuente
¿Qué pasa con la cita extraña? (¿Por qué salir sy gsalir de las comillas?)
GnP
@GnP Jaja, eso se hereda del OP.
heemayl
oecho ,,,,, |sed s':\(,\)\(,\):\1*:’g
njboot
8

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'
,*,*,*,
Sundeep
fuente