Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: miguel088 en 8 Noviembre 2013, 15:13 pm



Título: (SOLUCIONADO) Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: miguel088 en 8 Noviembre 2013, 15:13 pm
Buenos días, soy novato en esto de los scripts y necesitaría vuestra ayuda.

Os cuento, tengo un txt similar a este:

Código:
location,day name,high,low,degrees unit,icon.png,windspeed,windspeed unit,wind_dir
LEMD,Friday,17,5,C,4.png,5,Kph,W
LEMD,Saturday,14,6,C,4.png,4,Kph,NW
LEMD,Sunday,16,7,C,2.png,4,Kph,NNW
LEMD,Monday,21,9,C,1.png,4,Kph,N
LEMD,Tuesday,21,8,C,1.png,4,Kph,N
LEMD,Wednesday,18,5,C,1.png,5,Kph,NNE
LEMD,Thursday,18,7,C,1.png,3,Kph,NE


Lo que necesitaría es que a través de un batch traducir los días de la semana a castellano y quede como esto, pero en otro txt diferente:

Código:
location,day name,high,low,degrees unit,icon.png,windspeed,windspeed unit,wind_dir
LEMD,Viernes,17,5,C,4.png,5,Kph,W
LEMD,Sábado,14,6,C,4.png,4,Kph,NW
LEMD,Domingo,16,7,C,2.png,4,Kph,NNW
LEMD,Lunes,21,9,C,1.png,4,Kph,N
LEMD,Martes,21,8,C,1.png,4,Kph,N
LEMD,Miércoles,18,5,C,1.png,5,Kph,NNE
LEMD,Jueves,18,7,C,1.png,3,Kph,NE

He probado con este codigo:

Código:
sed.exe -e "s/Friday/Viernes/" TIEMPO.txt >TIEMPOSCAS.txt

Y funciona, instalando la aplicación Sed en mi pc según he leído en algún hilo antiguo del foro. El problema es, que no he conseguido encontrar la solución, que me sustituya en un solo comando todas los días de la semana de todas las lineas y no solo uno como en el ejemplo.

He probado distintas cosas, separar los datos con dobles comillas o con tuberias...pero ninguno me ha funcionado. Estoy seguro que es alguna tontería y alguien mas capacitado que yo seguramente los sepa, por eso recurro a vosotros.

Espero que alguien me pueda ayudar.

Muchas gracias de antemano y un saludo.


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: Almapa en 9 Noviembre 2013, 12:17 pm
Solo puede ser un comando?


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: miguel088 en 9 Noviembre 2013, 12:23 pm
Solo puede ser un comando?

O en varios, me explique mal, me referia a hacerlo en una sola acción. Pero se puede utilizar todos los comandos que hagan falta.


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: mad_soft en 9 Noviembre 2013, 12:53 pm
Ya lo habrás pensado y no será lo que pidas, pero
¿Porque no creas un script que lo haga?
pega tantas lineas como días quieras remplazar y luego ejecutas el script
Código:
#!/bin/bash
sed.exe -e "s/Friday/Viernes/" TIEMPO.txt >TIEMPOSCAS.txt


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: miguel088 en 9 Noviembre 2013, 12:59 pm
Ya lo habrás pensado y no será lo que pidas, pero
¿Porque no creas un script que lo haga?
pega tantas lineas como días quieras remplazar y luego ejecutas el script
Código:
#!/bin/bash
sed.exe -e "s/Friday/Viernes/" TIEMPO.txt >TIEMPOSCAS.txt

Lo pensé y lo probé, pero el problema es que me traducia solo la ultima linea, ya que se va ejecutando el comando sobre el txt original y en el txt resultante solo salia traducida la última linea.

Imagino que habrá alguna forma (que desconozco) es que dentro de ese comando sed se puedan meter todas las traducciones.


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: Almapa en 9 Noviembre 2013, 13:04 pm
Esto en batch funciona, mira a ver si te sirve:

Código:
@echo off
cls
Setlocal EnableDelayedExpansion
set /p archivo="Arrastra el archivo a modificar: "
for /f "tokens=*" %%a in ('type %archivo%') do (call :cambiar %%a)
:cambiar
set var=%*
if %2==Monday (echo %var:Monday=Lunes%>>nuevo.txt) else (if %2==Tuesday (echo %var:Tuesday=Martes%>>nuevo.txt) else (if %2==Wednesday (echo
%var:Wednesday=Miércoles%>>nuevo.txt) else (if %2==Thursday (echo %var:Thursday=Jueves%>>nuevo.txt) else (if %2==Friday (echo %var:Friday=Viernes%>>nuevo.txt) else (if %2==Saturday (echo %var:Saturday=Sábado%>>nuevo.txt) else (if %2==Sunday (echo %var:Sunday=Domingo%>>nuevo.txt) else (echo %var%>nuevo.txt)))))))
GOTO :eof


Un saludo


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: mad_soft en 9 Noviembre 2013, 13:13 pm
claro, porque el resultado del cambio se guarda en tiemposcas.txt y en la siguiente linea vuelves a comprobar tiempo.txt con lo que el cambio anterior no está hecho. Haz una copia del archivo en cada instruccion sed, o juega con dos ficheros.
Código:
#!/bin/bash
sed.exe -e "s/Monday/Lunes/" TIEMPO.txt >TIEMPOSCAS.txt
cp TIEMPOSCAS.txt TIEMPO.txt
sed.exe -e "s/Thuesday/Martes/" TIEMPO.txt >TIEMPOSCAS.txt
...
o bien cambiando los 2 archivos.
Código:
#!/bin/bash
sed.exe -e "s/Monday/Lunes/" TIEMPO.txt >TIEMPOSCAS.txt
sed.exe -e "s/Thuesday/Martes/" TIEMPOSCAS.txt >TIEMPO.txt
sed.exe -e "s/Wednesday/Miercoles/" TIEMPO.txt >TIEMPOSCAS.txt
....


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: miguel088 en 9 Noviembre 2013, 13:58 pm
Muchísimas gracias a los dos, parece que funciona casi bien  ;-)

Solo me queda una ultima cuestión, en el caso de que quiera traducir al contrario o a otro idioma desde el castellano, como el Miércoles y el Sábado tienen tildes no me coge el cambio:

Ejemplo:

sed.exe -e "s/Miércoles/mercredi/" TIEMPOCAS.txt >TIEMPOFRANCES.txt

En este caso, me cambia el resto de días, pero los que llevan tilde no me los reemplaza, sabéis por que puede ocurrir?

Muchísimas gracias a todos de verdad.

Un saludo!


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: mad_soft en 9 Noviembre 2013, 14:06 pm
En este foro dicen que no es problema del sed, sino de que las locales de tu sistema son unas y el archivo esta creado en otro locale....
http://www.ubuntu-es.org/node/159621#.Un4yesPsHtc (http://www.ubuntu-es.org/node/159621#.Un4yesPsHtc)


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: miguel088 en 9 Noviembre 2013, 14:20 pm
Efectivamente, lo datos de origen que me pasan por FTP están formato UTF y para el software final necesita que los datos este en formato ANSI y antes de llegar a la traducción tengo otro bat creado que transforma todos los txt de utf a ansi.

El problema es que el txt a traducir esta si o si en ansi.

No se podría realizar la traducción de las tildes con el formato ANSI?

Perdonar por mi ignorancia, que en estos campos me pierdo bastante..

Gracias de antemano!

Un saludo.


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: mad_soft en 9 Noviembre 2013, 16:38 pm
No sabría que decirte, ¿dejándolo en utf el script de  sed funciona bien?
Si es así el problema viene cuando le pasas el conversor. También puede ser que como recuerdo los acentos pertenecen al ansi extendido (igual me equivoco) y a lo mejor tu conversor está convirtiendo a un ansi normal de 127 caracteres.


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: miguel088 en 9 Noviembre 2013, 17:29 pm
Acabo de probar el script antes de hacer la conversión, el txt original me lo pasan en UTF-8 sin BOM y no funciona, me sigue haciendo lo mismo.

Traduce correctamente todas los días salvo el Miércoles y Sábado que llevan tilde.

Así que yo creo que el problema viene del propio sed.

Gracias!


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: Eleкtro en 11 Noviembre 2013, 06:01 am
Es suficiente con obtener la representación correcta.

Para la é de Miércoles:
Código:
sed.exe -e "s/Miércoles/Dimecres/" "File.txt" > "Output.txt"

Para la á de Sábado:
Código:
sed.exe -e "s/Sábado/Disabte/" "File.txt" > "Output.txt"

Para futuras necesidades:
Código:
iconv -f latin1 -t utf-8 "File.txt" | sed "s/Sábado/Disabte/" | iconv -f utf-8 -t latin1
-> iconv (http://sourceforge.net/projects/gnuwin32/files/libiconv/1.9.2-1/libiconv-1.9.2-1-bin.zip/download?use_mirror=surfnet&download=)

Saludos


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: miguel088 en 11 Noviembre 2013, 10:10 am
Muchas gracias por la respuesta Elektro, pero me sigue ocurrido los mismo, lo he probado antes  y después de hacer la conversión y no me hace caso ni con la codificación Ansi ni con UTF

He probado también el código del iconv que me pusiste y ese ni siquiera me modifica la fecha del txt, aparentemente no hace nada.

Gracias, un saludo!


Título: Re: Ayuda para reemplazar palabras en un .txt con batch usando Sed
Publicado por: miguel088 en 11 Noviembre 2013, 15:42 pm
Hola chicos, perdonar por el doble post.
He conseguido solucionar mi problema con las tildes ;-) .

He conseguido que me pasaran el archivo de origen con los días de la semana en ingles, y ese idioma al no tener tildes pues no he tenido ningún problema al traducirlo a otro que tampoco las lleva.

Muchísimas gracias a todos por toda vuestra ayuda, que si no llega a ser por vosotros todavía estaría intentando reemplazar una palabra xD

Un saludo!!