Quiero tomar los dos últimos números (uno int, uno flotante; seguido de espacios en blanco opcionales) e imprimir solo ellos.
Ejemplo:
foo bar <foo> bla 1 2 3.4
Debería 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 del grupo?
-r
opción o `--regexp-extended`, de lo contrario recibí elinvalid reference \1 on
error 's RHS' del comando.(
y en)
lugar de\(
y\)
..*
al final de la expresión regular si la cadena que desea extraer no siempre está al final de la línea..*
es codicioso y sed no tiene un no codicioso.*?
(
y)
no generará errores en ubuntu 16.04. Así que creo que este comentario está desactualizado.grep es la herramienta adecuada para extraer.
usando su ejemplo y su expresión regular:
fuente
grep -o
llamadas canalizadas . stackoverflow.com/a/58314379/117471Y para otra opción, ¡iría con awk!
Esto dividirá la entrada (estoy usando STDIN aquí, pero su entrada podría ser fácilmente un archivo) en espacios, y luego imprimirá el último campo, pero luego el último campo. Las
$NF
variables contienen el número de campos encontrados después de explotar en espacios.El beneficio de esto es que no importa si lo que precede a los dos últimos campos cambia, siempre y cuando solo desee los dos últimos, seguirá funcionando.
fuente
El comando de corte está diseñado para esta situación exacta. Se "cortará" en cualquier delimitador y luego puede especificar qué fragmentos se deben generar.
Por ejemplo:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
Resultará en la salida de:
2 3.4
-d establece el delimitador
-f selecciona el rango de 'campos' para la salida, en este caso, es la sexta a la séptima parte de la cadena original. También puede especificar el rango como una lista, como
6,7
.fuente
awk '{ print $2" "$6 }'
cut -d " " -f 2,6
Estoy de acuerdo con @kent en que esto es muy adecuado
grep -o
. Si necesita extraer un grupo dentro de un patrón, puede hacerlo con un segundo grep.fuente