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