Puedes probar con este:
@echo off
Setlocal EnableDelayedExpansion
if "%3" == "" goto ayuda
set cadorig=%1
set cadorig=%cadorig:"=%
set cadsust=%2
set cadsust=%cadsust:"=%
for %%f in (%3) do (call :cambiar %%f)
goto fin
:cambiar
set archivo=%1
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:%cadorig%=%cadsust%! >>%archivo%)
goto :EOF
:Ayuda
Echo Reemplaza una cadena por otra en el contenido de archivos (con comodines)
Echo Formato: %0 cadorig cadsust archivos
Echo Si las cadenas contienen espacios deben escribirse entrecomilladas
echo No funciona si la cadena original contiene un "="
Echo Ejemplo:
echo %0 de DE *.txt
:Fin
Lo salvas con el nombre que desees (por ejemplo, SUST.BAT) y lo ejecutas sobre los archivos del directorio que te interese, por ejemplo:
SUST 0000000000000000 " " C:\prueba\*.txt
Debería sustituir cualquier cadena con nueve ceros por nueve espacios en todos los archivos de extensión TXT del directorio C:\prueba. Como indica el texto de la ayuda si alguna de las cadenas tiene espacios hay que ponerla entre comillas, si no los tiene son opcionales. En este caso la cadena sustituidora los tiene y por eso la pongo entre comillas.
Seguro que se puede optimizar, porque es una adaptación de uno similar que preparé para otra consulta (en la que el cambio se pedía en solo un archivo seleccionable):
http://www.todoexpertos.com/mitodoexpertos/expert/questions/view/2197719/reemplazar-stringsPero si sirve para tus necesidades supongo que estará cumplido el objetivo. Si tienes alguna duda o problema sigue preguntando.
Saludos,
GGG
Hola, cuando reemplazo un texto que contiene un signo de exclamación ! me lo hace desaparecer. ¿Hay alguna solución para eso? - Agustin Zammarrelli
Efectivamente el tratamiento al que se somete a los archivos, según mi propuesta, para modificar texto provoca que se eliminen los caracteres de "cierre de admiración" (!) que figuren en ese archivo. Más grave aún, si hay más de uno de esos caracteres en una línea se elimina todo el texto incluido entre ellos.Claramente la causa es la utilización del comando "Setlocal EnableDelayedExpansion" que habilita el uso de ese carácter (!) como indicador de variable interna. Se puede prescindir de ese comando si se sustituye el tratamiento directo por una llamada a rutina con nuevos problemas.Te sugiero que abras una nueva consulta porque para los "comentarios" solo se permiten 700 caracteres. - gggirald
Gracias por la respuesta rápida :) Hay otro problema (por lo menos conmigo), cuando termina de reemplazar todo, al final de cada línea deja como 20 espacios. Con consulta te referís a que pregunte? O hay otra sección? Saludos! - Agustin Zammarrelli
Sí. Me refiero a crear una nueva pregunta. Pero insisto en que es solo por tener más facilidad para tratar el tema. Por ejemplo, me gustaría conocer, exactamente, el BAT que usas, porque eso de los 20 espacios no consigo reproducirlo. Si trabajas con XP o Win7 de 32 bits hay una solución utilizando el EDLIN. Mira como hacerlo en Modificar archivo con .bat - gggirald
Excelente solución, muchas gracias por el apoyo. Además de cambiar una cadena de caracteres que tenia errada en un grupo de 22000 registros también lo uso para eliminar 180 espacios en blanco que me queda al final de cada registro del txt al crear el archivo y disminuyo el tamaño del archivo considerablemente. - Juan Carlos Hernaiz
Me alegro de que sigan sirviendo estas aportaciones. - gggirald
funciona con CASE SENSITIVE? es decir, que distinga mayúsculas de minúsculas a la hora de reemplazar, para mí es importante, creo que no lo hace. hay alguna manera de modificar el BAT para que lo haga? - Juan Mar
Pues creo que no funciona. Es decir en la parte a sustituir le da igual que sea mayúscula que minúscula, si encuentra la cadena la cambia. En la parte sustituidora sí que distingue las mayúsculas de las minúsculas, pero, lógicamente, esto no sirve de mucho. No se me ocurre como hacerlo de momento, pero pensaré en ello (aunque esté de vacaciones) y si encuentro alguna solución te la contaré por aquí. - gggirald
He hecho algunas pruebas y no encuentro una solución general que sea "sensible a la caja" ("case sensitive"). Si me cuentas el caso concreto tal vez se me ocurra una solución particular. - gggirald
Juan, ¿ha dejado de interesarte este asunto, has resuelto tu problema de alguna otra manera? Sí es así y quieres compartirla seguro que alguien te lo agradece. Si no lo has resuelto te sugiero que pruebes con powershell, la "nueva" shell de Windows que tiene un lenguaje mucho más potente que el MSDOS. - gggirald
Hola. Esa rutina funciona pero hay un caso en el que no logro hacer el reemplazo y es cuando quiero reemplazar el caracter #(numeral) por una comilla doble. La comilla doble la interpreta como blanco, aunque le ponga 3 comillas, es lo mismo. Alguna idea para este caso en particular? Muchas gracias. Saludos. - Juancho Fau
Efectivamente no encuentro la manera de pasar como parámetro una única comilla doble (sin embargo dos comillas dobles se pueden pasar entrecomilladas). Pero el procedimiento de sustitución no tiene problemas con esos caracteres por lo que la solución sería preparar un bat particularizado para este caso. Voy a ver si me deja añadirlo a la pregunta porque los comentarios están limitados en espacio. Si no puedo te sugiero que abras una nueva pregunta. - gggirald
No he podido. Sería algo así:@echo offSetlocal EnableDelayedExpansionif "%1" == "" goto ayudafor /f "tokens=* delims=" %%i in (%1) do (call :cambiar "%%i")copy /y kk_temp.txt %1del /q kk_temp.txtgoto fin:cambiarset ANT=%~1set NUE=!ANT:#="!echo %NUE% >> kk_temp.txtgoto :EOF:ayudaecho Reemplaza los # por " en todo el contenido de un archivoecho Formato: %0 archivoecho Ejemplo:echo %0 kk.txt:fin - gggirald
El editor de la página elimina los saltos de línea en los comentarios. No sé si serás capaz de "reconstruir" el BAT. Si no puedes hacerlo o no funciona sugiero que abras una nueva pregunta. - gggirald
Hola. Gracias. No logré hacerlo. Estoy probando con el comando EDLIN con un archivo.edl con el comando de reemplazo dentro. Como no lo conocía, estoy probando. Tengo problemas porque creo que el .edl no se puede crear con un editor común (http://www.lawebdelprogramador.com/foros/Ms-Dos/1042385-Reemplazar-con-edlin.html) y no entendí muy bien lo que explica como solución. - Juancho Fau
Venga hombre. Abre una pregunta y verás como conseguimos que funcione. La sustitución con edlin no tiene problemas de "transparencia" como las sustituciones propias de los comandos de MSDOS pero tiene dos problemas: uno, que el EDLIN ha dejado de existir y funcionar con versiones de Windows de 64 bits y otro que no admite líneas de más de 253 caracteres. - gggirald
Acabo de comprobar que también el EDLIN tiene problemas cuando uno de los caracteres es " (comillas dobles) - gggirald
UFFF!! Todo un desafío resolverlo! - Juancho Fau
Ok, ahora abro la consulta. Gracias. Saludos. - Juancho Fau