Linux en Espanol
 
Ayuda "egrep" (tema #24197)
Publicar nuevo tema  Responder al tema    Foros de discusión -> Programación
Autor Mensaje
SARGE553413
Forista
Registrado: 2011-12-24
Mensajes: 2

Publicado: 2011-12-24 05:05:11    Asunto: Ayuda "egrep"

Hola a todos.

Llevo un monton de horas intentando conseguir buscar en un texto n?meros de 4 cifras (teniendo en cuenta que los n?meros pueden ser 1200 o 1.200 por ej), mi problema es que no se usar el "|" con egrep, para decirle busca esto, o esto, o esto....

Yo intento escribir esto:

egrep \(" "[0-9]{4}" "\) -> Para buscar numeros entre 2 palabras.

Ahora me faltar?a meter un "or" y decirle egrep \(" "[0-9]{4}"\."\) ->
para n?meros que est?n al final de la l?nea.

Faltar?an los que son el inicio de una l?nea y los que llevan un punto en medio, pero como digo mi problema es el dichoso "or".

Me ayuda alguien por favor?

Muchas Gracias de antemano.
miguelgf
Forista


Registrado: 2006-12-28
Mensajes: 621

Publicado: 2011-12-24 13:56:58    Asunto:

Hola.

La cadena de definici?n de lo que hay que buscar te recomiendo que la encierres entre comillas simples.
Por otra parte, el "or" s? es el car?cter "|", pero al no tener entrecomillada la expresi?n regular de b?squeda tal vez el propio shell (el bash) est? interpretando el car?cter como una tuber?a (pipe).
Por ?ltimo, te faltaba poner un "\b" delante y detr?s de cada opci?n, para asegurar que se trata de "palabras" completas. Ten en cuenta que [0-9]{4} es cumplido por 1234 pero tambi?n por 64534655555555556 puesto que tiene 4 cifras seguidas (y m?s). Detectar el principio y fin de palabra te sirve mejor a tu prop?sito mucho m?s que ver los casos de de inicio de l?nea, fin de l?nea, en medio de la l?nea, inicio y fin de l?nea simult?neo, etc.
Mira ver si te sirve as?:
Fichero datos:
[code:1:585743c769]Hola, esta l?nea evidentemente no debe salir
Esta s? 1.258 porque tiene una cifra diferente de cero antes del punto y tres cualesquiera detr?s
Esta no 1.2583 porque tiene cuatro cifras despu?s del punto
Esta no 0.258 porque tiene la cifra de delante del punto es un cero
Esta s? 2587 porque tiene 4 cifras
Esta no 3.98 porque tiene solo dos cifras tras el punto
Esta no 56765 porque tiene 5 cifras
?ste debe salir aunque est? al final de la l?nea 1.236
8.658 est? al principio de l?nea y debe salir
?ste est? separado por una coma 1.251,patatas y a?n as? debe salir[/code:1:585743c769]
Script que lo procesa, separar.sh:
[code:1:585743c769]#!/bin/bash
cat datos | egrep -n -e '\b[0-9]{4}\b|\b[1-9]{1}\.[0-9]{3}\b'[/code:1:585743c769]
Me he permitido poner el par?metro "-n" para que sea m?s f?cil ver las l?neas que ha tratado. Luego se lo quitas t? si te estorba.
La salida es:
[code:1:585743c769][yo@maquinita kakita]$ sh separar.sh
2:Esta s? 1.258 porque tiene una cifra diferente de cero antes del punto y tres cualesquiera detr?s
3:Esta no 1.2583 porque tiene cuatro cifras despu?s del punto
5:Esta s? 2587 porque tiene 4 cifras
8:?ste debe salir aunque est? al final de la l?nea 1.236
9:8.658 est? al principio de l?nea y debe salir
10:?ste est? separado por una coma 1.251,patatas y a?n as? debe salir
[yo@maquinita kakita]$ [/code:1:585743c769]

F?jate que a?n as? hay un fallo. La l?nea 3 no debe salir porque tiene 4 cifras tras el punto, pero sale porque cumple la condici?n inicial, es decir sale porque 2583 ya es de por s? un n?mero de 4 cifras.

Te recomiendo que leas este enlace:
[url]http://www.vicente-navarro.com/blog/2007/04/13/expresiones-regulares-en-la-shell-ejemplos-de-uso-con-grep-awk-y-sed/[/url], salvo que alg?n moderador piense que estoy haciendo publicidad de otro sitio.

Y con eso termina de arreglarlo t?. Si no, puedes probar tu idea inicial de buscar entre dos blancos, un inicio de l?nea y un blanco, un blanco y un fin de l?nea y un inicio y fin de l?nea.

Saludos.

Miguel.





La marca registrada Linux (R) se usa siguiendo la sublicensia obtenida del "Linux Mark Institute",
el LICENCIATARIO exclusivo de Linus Torvalds, propietario de la marca en EEUU y otros países
The registered trademark Linux (R) is used pursuant to a sublicense from the Linux Mark Institute,
the exclusive LICENSEE of Linus Torvalds, owner of the mark in the U.S. and other countries