Los grupos de captura sed no funcionan.

Los grupos de captura sed no funcionan.

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/gpara obtener el primer número, sed "s/\([0-9]*\)/\2/gel segundo número y sed "s/\([0-9]*\)/\3/gel 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 fooserá \1, barserá \2y bazserá \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 \2no 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

información relacionada