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 esto. Debería poder usar sed "s/\([0-9]*\)/\1/g
para obtener el primer número, sed "s/\([0-9]*\)/\2/g
obtener el segundo número y sed "s/\([0-9]*\)/\3/g
obtener el tercer número. En cada caso, sin embargo, obtengo toda la cadena. ¿Por qué está pasando esto?
27
's/\([0-9]\)\([0-9]\)\([0-9]\).*/\1\2\3/'
capturar números individuales.Respuestas:
No podemos darle una respuesta completa sin un ejemplo de su aporte, 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)/
y luegofoo
será\1
,bar
será\2
ybaz
será\3
. No puede hacerlos/(foo)/\1/; s/(bar)/\2/
porque, en la segundas///
llamada, solo hay un grupo capturado, por\2
lo que no se definirá.Entonces, para capturar sus tres grupos de dígitos, necesitaría hacer:
O, lo más legible:
fuente
/(foo)/
en sed coincidirá con un(
carácter literal , seguido defoo
y luego un literal)
. Si desea capturar un grupo, debe escapar de los paréntesis o usar la-E
opción.-r
bandera, así que supongo que es por eso que aún no me he encontrado con esto.-r
bandera también lo hará, pero no es portátil. GNU sed lo admite, pero muchos otros no. El-E
es más universal.Ejemplo:
O, todos juntos:
fuente
Use Sed con -r, --regexp-extended para evitar todos los paréntesis escapados.
fuente