regex - sustituir - sed: imprimir solo grupo coincidente
sed reemplazar linea completa (4)
El comando de corte está diseñado para esta situación exacta. Se "cortará" en cualquier delimitador y luego se puede especificar qué trozos deben salir.
Por ejemplo: echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Producirá como resultado: 2 3.4
-d establece el delimitador
-f selecciona el rango de ''campos'' a la salida, en este caso son los segmentos 6º a 7º de la cadena original.
Quiero tomar los dos últimos números (uno int, un flotante, seguido de espacios en blanco opcionales) e imprimirlos solo.
Ejemplo:
foo bar <foo> bla 1 2 3.4
Debe imprimir:
2 3.4
Hasta ahora, tengo lo siguiente:
sed -n ''s//([0-9][0-9]*[/ /t][0-9.]*[/ /t]*$/)/replacement/p''
me dará
foo bar <foo> bla 1 replacement
Sin embargo, si trato de reemplazarlo con el grupo 1, se imprime toda la línea.
sed -n ''s//([0-9][0-9]*[/ /t][0-9.]*[/ /t]*$/)//1/p''
¿Cómo puedo imprimir solo la sección de la línea que coincide con la expresión regular en el grupo?
Haga coincidir toda la línea, por lo tanto, agregue a .*
Al comienzo de su expresión regular. Esto hace que toda la línea sea reemplazada por el contenido del grupo
echo "foo bar <foo> bla 1 2 3.4" |
sed -n ''s/.*/([0-9][0-9]*[/ /t][0-9.]*[ /t]*$/)//1/p''
2 3.4
Y para otra opción, ¡me iría con awk!
echo "foo bar <foo> bla 1 2 3.4" | awk ''{ print $(NF-1), $NF; }''
Esto dividirá la entrada (estoy usando STDIN aquí, pero su entrada podría ser fácilmente un archivo) en los espacios, y luego imprimirá el último campo y luego el último campo. Las variables $NF
contienen el número de campos encontrados después de la explosión en espacios.
El beneficio de esto es que no importa si lo que precede a los dos últimos campos cambia, siempre que solo desee los dos últimos, continuará funcionando.
grep es la herramienta correcta para extraer.
usando su ejemplo y su expresión regular:
kent$ echo ''foo bar <foo> bla 1 2 3.4''|grep -o ''[0-9][0-9]*[/ /t][0-9.]*[/ /t]*$''
2 3.4