Un conjunto de 'correpondencias' es un patron.
Para Buscar en Archivos de Texto se usa:
man egrep
egrep despliega solo esas lineas que 'correspondieron'
Algunos Metacharacters
^ representa 'corresponder' al principio de una linea
$ representa 'corresponder' al final de una linea
Ejemplos:
^from$ 'corresponde' que empieza en la linea seguido de f, r,
o, m
e inmediatamente seguido de fin de linea.
^$ 'corresponde' que la linea tiene principio de linea
seguido
de un final de linea, por ejemplo: una linea vacia.
^ 'corresponde' que la linea tiene principio de linea.
por ejemplo: tambien las lineas vacias.
Character Class
Permite listar caracteres en un determinado punto.
Ejemplos:
[Ii]ndex
#'corresponde' donde la primer letra es I o i
<[Hh][123]>
#<H1> <H2> <H3> <h1> <h2> <h3>
Character-Class metacharacter de rango: '-'
Permite establecer rangos de caracteres
Ejemplos:
<[Hh][1-3]>
#<H1> <H2> <H3> <h1> <h2> <h3>
[0-9A-Z_1!?]
#ya sea un digito, una letra mayuscula, un underscore, un signo
de
#de admiracion, un signo de pregunta
Negando Character Classes
<[Hh][^1-6]>
#un caracter H p h seguido de un digito que no sea 1, 2, 3, 4, 5, 6
egrep 'q^' palabras.txt
#iraq
#zaqqum
'Correspondiendo' con cualquier caracter: '.'
Permite 'corresponder' con cualquier caracter fuera de un character
class: []
Ejemplos:
22.03.1978
#. nos dice que puede 'corresponder' a cualquier caracter
22[/-.]03[/-.]1978
#. nos dice que es el caracter punto
'Correspondiendo' en combinaciones o alternativas: 'OR' = '|'
Este metacharacter significa 'or', es decir: multiples altermativas.
Ejemplos:
[Ff](irst|1st) [Ss]treet es lo mismo que [Ff](ir|1)st [Ss]treet
gr[ea]y es lo mismo que gr(e|a)y
#Pero no confundir que este ultimo es una alternativa 'OR'
#ya que el character class de la primera se refiere a un
#unico caracter, con el (c1|c2) pueden ser palabras o cracteres
^(From|Subject|Date):
#que empieze con From al principio de la linea o
#que empieze con Subject al principio de la linea o
#que empieze con Date al principio de la linea
#seguido de dos puntos
#Nota: Hay que tener cuidado de donde coloquemos ^ o $
Word Boundaries es como palabras con limite o algo asi:
Se pueden usar las metasequencias \< y \> si la version lo soporta.
'Corresponden' al principio y final de una palabra.
Ejemplos:
In Pablo's bar-net, beer cost $2.00
#'In' 'Pablo' 's' 'bar' 'net' 'beer' 'cost' '2' '00'
Metacharacter Nombre Significado
. punto cualquier unico caracter
[...] character class cualquier caracter
listado
[^...] negacion de character class cualquier caracter no
listado
^ caret pos al principio de linea
$ dollar pos al final de una linea
\< backslash less-than pos al principio de
palabra
\> backslash greater-than pos al final de una
palabra
| 'OR', barra cualquier alternativa
(...) Parentesis para limitar el espacio
de |
Items Opcionales: '?'
? significa que 'corresponde' a opcionalmente lo que sea.
se coloca en frente del caracter que se desea.
Ejemplo:
July? (fourth|4(th)?)
#aca la unidad (th) seria tomada como opcional, es decir podria
#que necesariamente no 'corresponda'
De repeticion: '+' y '*'
El metacharacter '+' significa uno o mas del item que precede hasta
no se cumpla, en cambio '*' trate de 'corresponder' tantas veces como
pueda.
En combinacion con espacios:
' *' permiten espacios opcionales.
' ?' permite un espacio opcional.
Ejemplos:
<H[1-6] *>
#corresponde a cualquiera de los 6 posibles <H> con cualquier
#cantidad de espacios antes de cerrar o sin ellos
<HR( +SIZE *= *[0-9]+)? *>
Repetition Metacharacters
mc Maximo a tratar Sifnificado
? 1 Uno permitido; no requerido (opcional)
* Sin Limite Permitidos si limite; no requerido (cantidad
opcional)
+ Sin Limite Uno requerido; mas permitidos (alguno
requerido)
Cuantificadores de intervalos: {,}
{min, max}
Significado:
{3,10}
#que 'corresponda' hasta 12 veces si es posible,
#que al menos 'corresponda' 3 veces.
Ignorando diferencias en Mayusculas con la herramienta egrep:
egrep -i '<HR( +SIZE *= *[0-9]+)? *>' archivos
Parentesis y Referencias Anteriores:
\<the +the\>
#'corresponde' a la palabra doble the
egrep -i '\<([a-z]+) +\1\>' archivos
#'corresponde' con cualquier palbra doble
#esta la limitacion de cuando termina en una linea y
#empieza en una nueva, hay que mejorar este codigo.
\1,\2,\3\n se refieren al conjunto de parentesis
creado en ese orden
'Escapear'
www\.josoroma\.com
#esto es para que sea el literal punto
#excepto dentro un character-class []
\([a-zA-Z]+\)
#esto es para 'corresponder' cualquier palabra entre ()
Un string entre comillas dobles:
"[^"]*"
#[^"] para decir cualquier caracter excepto un "
Cantidad en Dolares:
\$[0-9]+(\.[0-9][0-9])?
#aca $.49 no 'corresponde' mas adelante se solucionara
Una introduccion a PERL:
perl -w archivo ejecuta el archivo y nos deja ver mensajes de
warnings
Codigo de solucion palabras dobles en PERL:
$/ = ".\n";
while (<>) {
next if !s/\b([a-z]+) ((\s|<[^>]+>)+)
(\1\b)/\e[7m$1\e[m$2\e[7m$4\e[m/ig;
s/^([^\e]*\n)+//mg;
s/^/$ARGV: /mg;
print;
}
Codigo para ver donde un string solo contiene digitos
print "Digite una cadena a validar";
$esdig = <STDIN>; #lee una linea desde la entrada standard
chop($esdig); #remueva \n de la variable $esdig
if ($esdig =~ m/^[0-9]+$/)
{
print "Solo Digitos\n";
}
else
{
print "No Solo Digitos\n";
}
^[0-9]+$ es la regex
m/.../ significa que haga que una regex 'corresponda'
== test de donde dos numeros son iguales
eq test de donde dos strings son iguales
= asigna un valor a una variable
=~ linkea una busqueda regex con la cadena target $esdig
imprimir sin formatear:
print "$colones colones = $dolares\n";
imprimir con formato:
printf "%.2f colones = %.2f dolares\n", $colones, $dolares;
Codigo de conversion a Celsius o Fahrenheit:
print "Digite una temperatura: ";
$temperatura = <STDIN>;
chop($temperatura);
if ($temperatura =~ m/^([-+]?[0-9]+(\.[0-9]*)?)(CF)$/)
{
#cada 'correspondencia' parentizada es asignada a variables
$num = $1; #numero
$tipo = $3; #CF
#$1 [-+]?[0-9]+(\.[0-9]*)?
#$2 \.[0-9]*
#$3 [CF]
if ($tipo eq "C")
{
#Si la entrada $num fue Celsius, se calcula Fahrenheit
$celcius = $num;
$fahrenheit = ($celsius * 9 / 5) + 32;
}
else
{
#Si la entrada $num fue Fahrenheit, se calcula Celsius
$fahrenheit = $num;
$celcius = ($fahrenheit - 32) * 5 / 9;
}
printf "%.2f Celsius = %.2f Fahrenheit\n", $celsius,
$fahrenheit;
}
else
{
print "Se esperaba un numero, no se entiende la entrada
\"$num\".\n";
}
Otros metacharacters:
\n nueva linea
\f ASCII formfeed
\t TAB
\b Backspace --> Actualmente es word boundary --> delimitador
de palabra
\s 'corresponde' con space, tab, newline, carriage return
Para agregar case-insensitive en PERL:
m/[a-z]/i
Lo que Perl regexes ofrece:
\t TAB
\n caracter newline
\r caracter carriage-return
\s una clase para 'corresponder' con: space, TAB, new line,
carriage-return, formfeed...
\S cualquier cosa excepto \s
\w [a-zA-Z0-9_] necesario para una palabra --> \w+
\W cualquier cosa excepto \w, es decir: [^a-zA-Z0-9_]
\d si es un digito [0-9]
\D cualquier cosa excepto \d [^0-9]
--
Jos� Pablo Orozco Mar�n
[EMAIL PROTECTED]
Web - SHTML
InterNexo - Tecnolog�as Internet
http://www.internexo.co.cr/
280-6720
--
�Desea desuscribirse? Escriba a [EMAIL PROTECTED] con
el tema "unsubscribe".