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".

Responder a