[Perl] expresió
n dudosa
Roberto Ruiz
rruiz@expoempresas.com
Mon, 7 Oct 2002 16:45:09 -0600
Hola Gonzalo, Dios te bendiga.
On Sat, Oct 05, 2002 at 03:48:45PM -0300, sondrobe wrote:
> gente:
> estuve probando un par de cosas sobre los siguiente:
>
> # cat *.html | grep src= | perl -e 's/\"\w+\"/\"\"/g'
¿Y para que usar 3 procesos si se puede hacer todo con Perl? ;)
> y lo que pretendo a partir de la expresión regular es que las etiquetas
> que contengas "src=" (la línea completa) todo lo que está entre "", siempre
> y cuando lo que está dentro es uno o más caracteres que me lo reemplace por
> "",y por ejemplo de las líneas siguientes:
>
> <td width="300" height="26" align="CENTER" valign="BOTTOM"><img
> src="chp1il1e.gif" width=300 height=26 border=0 alt="Fundamentals of Remote
> Sensing"></td>
> <td width="300" height="286" align="CENTER"><img src="chp1il2.jpeg"
> width=300 height=286 border=0 alt="Illustration"></td>
>
> tendría que quedar así (está implícito que no me funciona, jaja):
>
> <td width="300" height="26" align="" valign=""><img src="" width=300
> height=26 border=0 alt=""></td>
> <td width="300" height="286" align=""><img src="" width=300 height=286
> border=0 alt=""></td>
>
> que en realidad lo único que me interesa es trabajar sobre el
> atributo src= de la etiqueta image, pero se alargaría mucho la
> expresión regular sin mucho sentido, ya que los demás campos no
> alteran demasiado la estructura.
Si lo único que te interesa quitar únicamente el valor de los
atributos src, puedes usar:
perl -ne 'if(/img.+src="(.+?)"/){s/$1//;print}' *html
Esto, contrario al ejemplo que das, presenta en pantalla la línea
modificada, sólo tienes que quitar el print si no quiere eso. También
cabe hacer mención de que en HTML también es válido poner el nombre
sin estar entre comillas en algunos casos (no que sepa mucho HTML,
pero lo he visto usado así).
Y si quieres, para que las líneas de tu ejemplo queden cómo dices,
puedes usar agregar otro s/// cómo sigue:
perl -ne 'if(/img.+src="(.+?)"/){s/$1//;s/="[^0-9"]+?"/=""/g;print}' *html
Pero en realidad éste ya lo saque más a prueba y error que porque sepa
mucho de Perl, ya que cómo puede ver, lo que hace en realidad es
preservar los "" que tengan puros dígitos (esto porque algunas de las
cadenas que mencionas tienen espacios y no entran en \w).
Si te interesa más información sobre cómo descifar las expresiones
regulares usadas, puedes consultar los siguientes documentos:
perldoc perlrun
perldoc perlretut
perldoc perlre
Bueno, es todo, espero que te sirva, pero si no sirve, pos es que no
tiene garantía. ;)
Saludos
Roberto Ruiz
p.d. Para los compañeros perleros de la lista que gusten de los
concursos de golf, a ver si lo pueden hacer en menos golpes. Ya que la
solución actual está muy grande (en mi opinión). ;)
p.p.d. Cómo en Perl siempre hay otras formas de hacerlo, también se
puede lograr hacendo un goto, así:
perl -pe 'goto LINE unless /img.+src="(.+?)"/;s/$1//' *html
Pero es más grande (en términos de golf).