domingo, 3 de marzo de 2013

Usar regex Perl en tuberia Unix



Esta entrada es un poco para decir que,el blog se va a "morir" un poco :(,ya no tengo el mismo tiempo que antes y el tiempo que tengo lo uso para aprender desarrollo de software,por mi cuenta claro :D

Y bueno,no voy a borrar el blog como lo he hecho antes,ya que mucha gente aun lo visita 3,000 o 4,000 visitas diarias(paginas vistas) y ocasionalmente 11,000 o 10,000 :



y tengo comprado el dominio por 4 años así que hay Tiempo de Tux para rato :D

El hecho es que hay muchas cosas las cuales han limitado el blog y mi tiempo a mantenerlo activo,ya que antes hasta eran tres entradas o mas diarias y ahora una cada 3 o 5 dias, el tema principal del blog que es Linux ya no hay mucho que decir,Linux va bien y mientras mas lo usa uno mismo mas aprende sin la necesidad de buscar información o por lo menos buscar en blog's esa teoría basandola en la comparación con mis circunstancias por su puesto,por ejemplo yo,uso Gentoo y no busco ya casi nada de información en blog's(para hacer X o Y cosa) lo único que necesito por ayuda o por capricho lo busco en la pagina oficial del desarrollador o de la distribucion de Linux,o tambien en wikipedia, así que no hay mucho que decir, y tan poco quiero que el blog se convierta en como dicen offtopic.

En el caso del iOS hay mucha información y mucha ayuda que les puedo ofrecer a los usuarios,ya que incluso estoy comenzando a desarrollar para el,pero también hay muchos problemas y algunos no tienen una solución tan simple y no tengo mucho tiempo para atender los problemas de algún tutorial que haya hecho.

En el caso de Unix y scripting,es lo mismo que con Linux,no muchas personas buscan esta información en blog's o por lo menos en mi caso y en la información que me da google, acerca de las entradas que coloco acerca de este tema,aun así seguiré colocando este tipo de información ya que me sirve bastante,para usarlo como documentación.

Esos son los tres principales temas del sitio y aunque algunas personas no están de acuerdo por mesclar iOS con Linux,ni modo,soy Unixero pero incluso tengo un sitio sobre Windows ya que la informática es mi pasión y no solo Linux o BSD o Windows o Unix,si no todo lo que todo lo tenga que ver con el software de una computadora me gusta sin importar las licencias.

Aun así seguiré haciendo entradas de Linux/iOS/Unix/Scripting pero no tan recurrentemente como antes :(

Bueno eso es todo,ya que si googleaste y no conocías este sitio,voy a dar una mala impresión del sitio,pero tampoco me hubiera gustado hacer una entrada solo para esto.


Tutorial

En las tuberias Unix podemos obtener información exacta de lo que necesitamos usando mas que nada:

grep,awk,cut,sed,perl
Con esas cinco herramientas podemos hacer cosas sorprendentes para buscar y mostrar información y en este caso lo que necesitamos es manipular texto,para lo cual perl es uno de los lenguajes de programación mas potentes,pero como he dicho,parte del poder de perl para manipular texto viene de las expresiones regulares,como sabran el mas indicado para esto es sed,pero no esta de mas usar perl en los pipes Unix:

Veamos un ejemplo


Abre una terminal y teclea:


echo "H123o64123l24234a45232314323 13M305245u325n67245d352435o534" 


Eso que escribí es teclas a lo tonto,bueno no tan a lo tonto tiene un texto entre números{a lo tonto},pero si lo tecleamos así en consola solo mostrara:

Aquí el poder de perl y los pipes Unix:

Ahora teclen en consola:

echo "H123o64123l24234a45232314323 13M305245u325n67245d352435o534" | perl -p -e 's/\d//g'
Y el resultado es :



Lo que estamos asiendo aqui no es magia:

| inicia el pipe

perl -p -e son las opciones que necesita perl para poderlo usar a lo sed

'lo que vaya aqui(entre comillas)' es lo que ejecutara perl


s/\d//g Es una expresion regular que lo que hace es eliminar todos los digitos:

Es esta expresión :

s/\d//g
s/// # Cambiador de texto

s/// cambia lo que le digamos por lo que le digamos:

s/lo que le digamos/por lo que le digamos/
Por ejemplo tenemos la palabra Rama y queremos cambiarla por Mama,solo tenemos que modificar la R:

s/R/M/
Ejemplo
echo "Rama" | perl -p -e 's/R/M/'

Con eso basta,otro operador es que es similar es el operador de traduccion tr///, este operador recorre todo el texto sea una linea o mas y todas las palabras que concuerden,por ejemplo


echo -e "Hola me llamo:\ndemianx864" | perl -p -e 'tr/a/e/'

El que seria el equivalente a:

echo -e "Hola me llamo:\ndemianx864" | perl -p -e 's/a/e/g'

 En la parte de g, es una opción también puede ser:


i # no reconoce mayúsculas o minúsculas

m # Reconoce varias lineas y las toma como solo una(ignora \n)

g # Recorre toda la cadena y trabaja todos los coincidentes

En la parte de s/// tenemos también tr/// y otras mas,las cuales no recuerdo en este momento,pero esas dos son las mas útiles.

En la parte de texto tenemos varias opciones:

echo -e "itimetux es tiempo de tux " | perl -p -e 's/^i/e/g'
Como en este caso la opcion ^ quiere decir solo principio de texto: tenemos tambien final de texto


echo -e "itimetux es tiempo de tux" | perl -p -e 's/x$/e/g'
En la parte \d es donde tenemos mas opciones,ya que esto quiere decir solo numeros pero tambien tenemos:

\d # Se usa para dígitos

\D # Contrario a \d

 \s # Quita espacios en blanco

\S # Deja solo los espacios

\t # Cualquier tabulador

\w # Busca palabras y caracteres alfa-numericos,podemos pensar que es similar a \s,pero en este caso podemos usarlo en una estructura selectiva:

\W # Contrario a \w

Y por ultimo si queremos quitar simbolos no alfa numericos,pero no todos como con \W podemos usar corchetes []

Por ejemplo

echo "Voy a borrar itimetux.com :(" | perl -p -e 's/[:(]//g'


Lo que valla adetro de [] pueden ser caracteres no alfa numericos :D

Y el ultimo truco,borrar lo que valla después de algo,por ejemplo un punto:


echo "Tiempo de Tux es itimetux.com.net.org.gob.mx" | perl -p -e 's/[.].*//g'
Basta con .*, esto [.] tuvo que ser asi ya que un punto es no alfa numerico y debe ir adentro de []


Y si quieren ver el poder de un pipe,veanlo:

Abran una terminal y escriban :


curl http://www.itimetux.com/2012/12/mejores-repos-para-cydia-2013.html
Esto descarga la entrada de las mejores repos de cydia para el iphone,pero en formato html(crudo) y lo que queremos es solo lo que esta citado,osea solo las url's de las repos, véanlo ustedes mismos en su navegador web :

Enlace

Y ahora véanlo en su terminal:


clear ; curl http://www.itimetux.com/2012/12/mejores-repos-para-cydia-2013.html 2>> /dev/null | grep blockquote | awk {'print $3'} | perl -p -e 's/large//g; s/[;">{<&]//g; s/span.*//g; s/nbsp.*//g;' | sed '/^$/d; $d'

Eso es todo :D

4 comentarios:

  1. Si esta bien pero se te olvido decir que puedes usar regex sobre archivos de texto usando cat,sed,tail,head en el pipe o otra cosa :)

    ResponderBorrar
    Respuestas
    1. Pues eso ya queda implícito,el pipe mas común es cat | grep y como dices, también se puede desde sed o awk,por eso no lo comente,solo emule texto con echo

      :D

      Borrar
  2. Hola, Demian. Lástima que no tengas tanto tiempo como antes para el blog. Espero que tu blog no se sume a la crisis de la linuxfera hispanohablante. :) Sea como sea, ánimo con todo. Muy bueno el tutorial de expresiones regulares en Perl.

    ResponderBorrar
    Respuestas
    1. Si algo leí de la crisis,pero ya pase por eso hace como un año,hasta borre el blog :(

      Pero aquí seguimos,lo mas seguro es que así suceda con todos los compañeros,solo es momentáneo

      Saludos :D

      Borrar

Los comentarios serán revisados antes de ser publicados.