texto sustituir script reemplazar para linea insertar especiales eliminar completa comando caracteres caracter regex sed

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