Tengo una cadena del formato [0-9]+\.[0-9]+\.[0-9]
. Necesito extraer el primer, segundo y tercer número por separado. Según tengo entendido, los grupos de captura deberían ser capaces de hacer esto. Debería poder utilizar sed "s/\([0-9]*\)/\1/g
para obtener el primer número, sed "s/\([0-9]*\)/\2/g
el segundo número y sed "s/\([0-9]*\)/\3/g
el tercer número. Sin embargo, en cada caso obtengo la cadena completa. ¿Por qué está pasando esto?
Respuesta1
No podemos darle una respuesta completa sin un ejemplo de sus aportes, pero puedo decirle que su comprensión de los grupos de captura es incorrecta. No los usa secuencialmente, solo se refieren a la expresión regular en el lado izquierdo del mismo operador de sustitución. Si captura, por ejemplo, /(foo)(bar)(baz)/
entonces foo
será \1
, bar
será \2
y baz
será \3
. No se puede hacer s/(foo)/\1/; s/(bar)/\2/
, porque en la segunda s///
convocatoria solo hay un grupo capturado, por lo que \2
no se definirá.
Entonces, para capturar sus tres grupos de dígitos, deberá hacer:
sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
O, más legible:
sed -E 's/([0-9]*)\.([0-9]*)\.([0-9]*)/\1 : \2 : \3/'
Respuesta2
Ejemplo:
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'
123
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'
456
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'
78
O todos juntos:
$ echo "123.456.78" |sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1 : \2 : \3/'
123 : 456 : 78
Respuesta3
Utilice Sed con -r, --regexp-extended para evitar todos los paréntesis de escape.
echo "1234.567.89" | sed -r 's/([0-9]+)\.([0-9]+)\.([0-9]+)/\1, \2, \3/'
1234, 567, 89 #output