BandaAncha.eu

Comunidad de usuarios
de fibra, móvil y ADSL

¿Filtrar líneas de texto a través de consola?

BocaDePez
BocaDePez

El script oficial Rapidshare Perl Uploader ( (link roto) ) permite subir, a través de consola, archivos a cuentas anónimas, de colector y premium de Rapidshare. Además, tras la subida del archivo, calcula el MD5 del archivo para comprobar que no lo ha subido corrupto. Incluso existe una variante de ese script que permite retomar la subida interrumpida de archivos (aunque realiza las subidas más lentamente).

La manera usual de usar el script es la siguiente:

$ rsapi.pl [nombre_fichero_a_subir] free

Para subir de forma recursiva todos los ficheros presentes en un directorio uso lo siguiente:

$ for i in *; do rsapi.pl "$i" free; done

Tras terminar la subida de el/los fichero/s, crea un archivo de texto llamado "rsulres.txt" que contiene los enlaces finales de descarga, los enlaces para borrar lo subido y si el MD5 coincide:

savedfiles=1 forbiddenfiles=0 premiumaccount=0 freeowner=0

File1.1=(link roto)
File1.2=(link roto)
File1.3=20364
File1.4=13B28E07E68C617A41A256E8BC91BD54
File1.5=Completed

savedfiles=1 forbiddenfiles=0 premiumaccount=0 freeowner=0
File1.1=(link roto)
File1.2=(link roto)
File1.3=111104
File1.4=A8A67EF5FC6F75D1C137F750B2ABB42F
File1.5=Completed

savedfiles=1 forbiddenfiles=0 premiumaccount=0 freeowner=0
File1.1=(link roto)
File1.2=(link roto)
File1.3=6077
File1.4=7C71349A619F867F412B789AEBAF1874
File1.5=Completed

savedfiles=1 forbiddenfiles=0 premiumaccount=0 freeowner=0
File1.1=(link roto)
File1.2=(link roto)
File1.3=22528
File1.4=3B31F390C05338A34D8F6B59525C0460

File1.5=Completed

Bien, ahora viene mi duda: quisiera, a través de la línea de comandos, exportar solamente los enlaces de descarga a un archivo de texto. He estado probando con los comandos grep y tr, pero solamente he tenido éxito con grep. Ya que los enlaces finales de descarga empiezan todos por "File1.1=", he conseguido filtrarlos a un archivo de texto, mostrándose de la siguiente manera:

File1.1=(link roto)

File1.1=(link roto)
File1.1=(link roto)

File1.1=(link roto)

Me faltaría, por tanto, eliminar del texto "File1.1=" y ".html" (o, como mínimo, lo primero) para que me quedase una lista de enlaces preparada para descargar con un gestor de descarga por línea de comandos (por ejemplo, plowshare). Como he comentado anteriormente, tr me elimina todo lo que empiece por "F", por "i", por "l", etc.

El editor de texto gráfico para Gnome gedit sí permite borrar o reemplazar la cadena de caracteres deseada, y supongo que por línea de comando se podrá hacer algo parecido, ¿o no?

Muchas gracias por leer toda esta parrafada y por su inestimable ayuda.

Salud.

xavisuper

Yo te sugeriría el comando awk. Puedes hacer aunténticas virguerías con él, perooo ... es bastante complejo. Si te atreves con él, puedes tirar de 'man awk' o de algún tutorial de Internet para aprender a utilizarlo; te llevará un tiempo hacerte con él, pero puede merecer la pena si vas a hacer ediciones de texto de ese tipo.

Una opción más simple, aunque posiblemente menos potente, es usar grep para seleccionar líneas, como ya has hecho, y luego el comando cut para trocear las líneas. cut admite varias opciones, como cortar en posiciones fijas, o cortar por campos, indicándole tú el carácter separador de campo que te vaya bien (por ejemplo, el carácter "=")

Otro clásico de la edición en línea es sed. Yo lo usaba bastante en casos como el que cuentas, como alternativa al tandem grep+cut, aunque como decía al principio, me he pasado a awk.

Y supongo que en los últimos 14 años habrán aparecido otras herramientas. Que opinen los más jóvenes.

🗨️ 2
BocaDePez
BocaDePez

Gracias por su respuesta. Sí, estoy viendo que es algo enrevesado awk; pero buscando cosas específicas por Google, también he encontrado una solución para mi caso particular:

$ cat rsulres.txt |grep File1.1 |awk '{sub(/File1.1=/,"")sub(/.html/,"");print}' >> lista_descarga.txt

Es otra alternativa a la solución que he puesto más abajo con sed.

Salud.

🗨️ 1
xavisuper

Sí, así es. No me he parado a comprobar la sintaxis (puede que un signo ; o un espacio entre las dos funciones sub, no estoy seguro) pero si lo has probado tú y funciona, pues está bien.

Sólo un detalle, te puedes ahorrar un comando:

cat rsulres.txt |grep File1.1

lo puedes sustituir por

grep File1.1 rsulres.txt

con el mismo resultado. Si ves que no va bien de todo, prueba a poner File1.1 entre comillas ("File1.1") o entre apóstrofos ('File1.1').

vukits

reemplazar una cadena dentro de un texto se hace con sed
en guguel hay miles de resultados.... ahora mismo estoy tonto y no puedo escribir un script ;)
saludos

🗨️ 1
BocaDePez
BocaDePez

Muchas gracia de nuevo, amigo vukits. Sí, es con sed:

$ cat rsulres.txt |grep File1.1 |sed 's:File1.1=::' |sed 's:.html::' >> lista_descarga.txt

"Todos los días se aprende algo nuevo, por muy burro que sea uno" (Refranero popular)

Salud.