On Wed, 27 Feb 2002, Jos� Pablo Orozco Mar�n wrote:
> Tengo el siguiente reto:
>
> Necesito un script que a paritr de un directorio recursivamente en todos
> los archivos con extensiones: *.shtml *.php *.js
> Encuentre el tag:
> <img src="PATH_e_imagen" width="XX" height="XX" border="X" alt="XX">
> Por lo que veo lo comun seria:
> <img src="PATH_e_imagen"

Aqu� va un script que puede hacer eso. Como siempre, no es la �nica manera
de lograr el cometido. CAVEAT EMPTOR: no tiene control de errores, pero
deber�a ser f�cil de agregar.

prueba.sh
#!/bin/sh
awk  '{
  while (match($0,/< *[Ii][Mm][Gg] *[Ss][Rr][Cc] *= *\"([[:alnum:]]+\.?\/?)+\"/)>0) {
    IMAGEN=substr($0,RSTART,RLENGTH)
    $0=substr($0,RSTART+RLENGTH)
    match(IMAGEN,/\"([[:alnum:]]+\.?\/?)+\"/)
    print substr(IMAGEN,RSTART+1,RLENGTH-2)
  }
}' `find $1 \( -type f -a \( -name \*.html -o -name \*.php -o -name \*.js \) \) -print`

> Y que me devuelva en correo o en un .txt los PATHS. es decir lo que iria
> en PATH_e_imagen

�ste lo que hace es imprimir el listado, �nicamente. Se ejecuta:

./prueba <directorio>

Por ejemplo:

alf@delta:~$ ./prueba Personal
gandi000.gif

donde Personal es un directorio. Para que quede en un archivo, se puede
redirigir la salida.

El script hace dos cosas: primero (por las comillas de ejecuci�n) ejecuta:

find $1 \( -type f -a \( -name \*.html -o -name \*.php -o -name \*.js \) \) -print

que devuelve un listado de todos los archivos de tipo f (archivos
normales) cuyo nombre termine con cualquiera de las extensiones pedidas, a
partir del directorio especificado por $1 (el primer par�metro al script.
Ser�a bueno revisar que se haya recibido y, de lo contrario, imprimir un
mensaje de error o asumir que se trata del directorio actual (./))

Luego se ejecuta, para cada uno de los archivos, el programita de awk.
Este, para cada l�nea de la entrada, hace:

  while (match($0,/< *[Ii][Mm][Gg] *[Ss][Rr][Cc] *= *\"([[:alnum:]]+\.?\/?)+\"/)>0) {

sigue procesando la misma l�nea mientras encuentre una imagen. Esto es
importante por si hay l�neas que contengan m�ltiples im�genes. Ojo que el
patron contiene " *" en varios lugares, repeticiones de subpatrones con
puntos y separadores de directorio y selecciones de may�scula y min�scula,
por si alguna imagen est� montada con algo como

<    iMg sRc   =   "imagenes.nuevas/otras5/imagen.muy.bonita.gif"

aun as� hay casos que no deben estar cubiertos. (Por ejemplo, me acabo de
dar cuenta de que no soportar�a algo que contenga .., de manera que habr�a
que cambiar \.? por \.?\.? o, si sospechamos que puede llegar una imagen
de nombre "ojo...con.....esto......jpg", por \.*)

    IMAGEN=substr($0,RSTART,RLENGTH)

el match de arriba deja en las variables RSTART y RLENGTH la posici�n y
tama�o del patr�n encontrado. Con substr recortamos ese pedazo y lo
ponemos en la variable IMAGEN.

    $0=substr($0,RSTART+RLENGTH)

esto elimina de la l�nea actual todo lo que hay hasta el patr�n encontrado
(de manera que el while de arriba no se quede en un ciclo infinito).

    match(IMAGEN,/\"([[:alnum:]]+\.?\/?)+\"/)

Aqu� buscamos dentro de la variable IMAGEN el pedazo que est� entre
comillas. Recordemos que esto cambia el valor de RSTART y RLENGTH. En
realidad deber�amos cambiar este match por uno que encuentre la posici�n
de la primera comilla. A partir de esa posici�n, en la variable IMAGEN,
s�lo tenemos el nombre de la imagen y la comilla final. Lo actual no est�
malo, pero es repetir trabajo.

    print substr(IMAGEN,RSTART+1,RLENGTH-2)

imprimimos lo que est� entre las comillas (pero no las comillas. De all�
el +1 y el -2). Otra cosa interesante que podr�amos hacer es:

   print FILENAME":"substr(IMAGEN,RSTART+1,RLENGTH-2)

de esa manera, tendr�amos un listado con cu�l archivo hace referencia a
cu�l imagen. Es decir:

alf@delta:~$ ./prueba Personal
Personal/Gandi/renew.html:gandi000.gif

claro, ya teniendo ambos datos, se podr�a lograr algo m�s interesante
(como revisar si la imagen es una direcci�n absoluta o relativa y, de ser
relativa, combinar esta informaci�n con la del archivo para devolver la
ubicaci�n exacta de la imagen)

En fin, espero que esto sea �til.

Saludos,

-alf



--
�Desea desuscribirse?  Escriba a [EMAIL PROTECTED] con el tema
'unsubscribe'.  M�s informaci�n: http://www.linux.or.cr/listas

Responder a