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?

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
,*,,*,

¿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'
,*,*,*,
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.