¿Reemplazar varias líneas de texto diferentes en un bat?

Tengo una cuestión acerca de cómo reemplazar varias cadenas dentro de un texto de manera automatizada

Tengo una lista de archivos y los archivos que corresponde en una carpeta ej: un archivo llamado kakeka.txt y dentro del archivo de texto una configuración para el, ej: kakeka.txt=a1,1,2,2015

Pero a cada uno le corresponden nuevas combinaciones para este año, ejemplo, todos los valores "ka" ahora deben corresponder a "ma", ke "me" tanto en la carpeta como en el archivo de texto.

El puntol es que tanto el archivo como la línea de texto se llamen al final en este caso

mamema.txt

Bien, pues pude resolver el cambiar los nombres de los archivos con un código parecido a este

for %%f in (*.txt) do (set r0=%%f&call :ren)
:ren
set r1=%r0:ka=ma%
set r2=%r1:be=me%

set r(..)=%r(...):k...=m...%
rename "%r0%" "%r(...)%"

Goto:eof

(...) números infinitos

El anterior funcionaba sustituyendo por capas, donde se modificaba un archivo ya modificado hasta que la ultima modificación sobrescribir el original .

Intentando sustituir ahora las líneas correspondientes en el txt en contre una pregunta parecida con respuesta de gggirald donde de manera resumida ofreció una sintaxis para reemplazar una por una cada línea, en mi caso modifique la sintaxis para que reemplaza directamente lo que necesitaba:

set archivo=text.txt
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:ka=ma! >>temp.txt)
copy /y temp.txt %archivo%
del /q temp.txt
goto :eof

Mi pregunta ahora, ¿habrá alguna forma de utilizar una sintaxis parecida para reemplazar capa por capa los conjuntos en cuestión? He intentado de varias maneras pero solo una muy enrollada me ha servido

set archivo=text.txt
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:ka=ma! >>temp.txt)

set archivo1=temp.txt
for /f "tokens=* delims=" %%i in (%archivo1%) do (set ANT=%%i&echo !ANT:ke=me! >>temp1

set archivo(...)=temp(...).txt
for /f "tokens=* delims=" %%i in (%archivo(...)%) do (set ANT=%%i&echo !ANT:k...=m...! >>temp(...)

.txt)
copy /y temp(...).txt %archivo%
del /q temp*.txt
goto :EOF

(...) números infinitos

El problema principal es que se crean demasiados temporales, y no es fácil transcribir todos los cambios necesarios (alrededor de 250 cambios para unos 1200 archivos)

Enserio agradeceria su ayuda :D

1 Respuesta

Respuesta
1

Creo que no acabo de entender lo que quieres. Para empezar tal como planteas las cosas parece que bastaría sustituir la "k" por la "m" tanto en los nombres de archivos como en las líneas de los mismos. Imagino que si hay que recurrir a pares de letras será por algo que no se muestra en tu ejemplo, imagino que simplificado. En segundo lugar tampoco veo claro por qué haces varias pasadas para sustituir los valores de las líneas de texto. Con estas dudas de partida sería un poco sorprendente que acertase en la solución pero voy a hacer un intento aunque tal vez solo sirva para aclarar las partes que no he entendido. Supongo que en una carpeta tengo un número indefinido (infinito me parece un poco exagerado ;-)) de archivos de texto y que quiero cambiar, tanto en el nombre de los archivos como en las líneas que contienen los archivos, la letra "k" por la letra "m". El siguiente bat creo que conseguiría ese resultado:

@echo off
Setlocal EnableDelayedExpansion
cd d:\prueba
del /q temp.txt
for %%f in (*.txt) do (
set archivo=%%f
for /f "tokens=* delims=" %%i in (!archivo!) do (
set ANT=%%i&echo !ANT:k=m!>>temp.txt
)
del /q !archivo!
set archivo=!archivo:k=m!
copy /y temp.txt !archivo!
del /q temp.txt
)

Para que veas mi entorno de prueba y los efectos del BAT anterior te copio aquí la situación anterior y posterior a la ejecución y el contenido de alguno de los archivos:

D:\BAT>dir d:\prueba
 El volumen de la unidad D es ABR2003
 El número de serie del volumen es: 10F6-62F9
 Directorio de d:\prueba
04/07/2016  11:36    <DIR>          .
04/07/2016  11:36    <DIR>          ..
04/07/2016  08:56                96 kakeka.txt
04/07/2016  08:56                96 kakeku.txt
04/07/2016  08:56                96 kekeka.txt
04/07/2016  08:56                96 kikeko.txt
04/07/2016  08:56                96 kokeka.txt
04/07/2016  08:56                96 kokika.txt
04/07/2016  08:56                96 kukeka.txt
               7 archivos            672 bytes
               2 dirs  27.178.237.952 bytes libres
D:\BAT>type d:\prueba\kikeko.txt
kakeka.txt=a1,1,2,2015
kokeka.txt=b1,2,3,2015
kukake.txt=c1,1,5,2016
kikeka.txt=b1,3,3,2015
D:\BAT>sae
No se encuentra D:\prueba\temp.txt
        1 archivos copiados.
        1 archivos copiados.
        1 archivos copiados.
        1 archivos copiados.
        1 archivos copiados.
        1 archivos copiados.
        1 archivos copiados.
        1 archivos copiados.
D:\BAT>dir d:\prueba
El volumen de la unidad D es ABR2003
El número de serie del volumen es: 10F6-62F9
 Directorio de d:\prueba
04/07/2016  11:37    <DIR>          .
04/07/2016  11:37    <DIR>          ..
04/07/2016  11:37                96 mamema.txt
04/07/2016  11:37                96 mamemu.txt
04/07/2016  11:37                96 memema.txt
04/07/2016  11:37                96 mimemo.txt
04/07/2016  11:37                96 momema.txt
04/07/2016  11:37                96 momima.txt
04/07/2016  11:37                96 mumema.txt
               7 archivos            672 bytes
               2 dirs  27.178.266.624 bytes libres
D:\BAT>type d:\prueba\mimemo.txt
mamema.txt=a1,1,2,2015
momema.txt=b1,2,3,2015
mumame.txt=c1,1,5,2016
mimema.txt=b1,3,3,2015

Ya me contarás si se ajusta a tus necesidades o si hay que hacer algo más.

Antes que nada, Gracias por su respuesta!, como dice usted la cosa es un poco más complicada, y trate de simplificarlo: el listado de configuraciones viene dentro de un único archivo dentro de las carpetas. Digamos entonces que tengo tres archivos de valores, y uno de su respectiva configuración para trabajar en un programa:

otrese.txt

setreo.txt

seotre.txt

cnfg.ini 

A su vez el ini contiene varias configuraciones para cada archivo

otrese.txt=o1,1,2,2015
otrese.txt=tre1,1,2,2015
otrese.txt=se1,1,2,2015

setreo.txt.txt=se2,1,2,2015
setreo.txt.txt=tre2,1,2,2015
setreo.txt.txt=o2,1,1,2015

seotre.txt.txt=se3,1,2,2015
seotre.txt.txt=o3,1,2,2015
seotre.txt.txt=tre3,1,2,2015

los reemplazos deben ir desde tríos de letras hasta un carácter, asi que necesito reemplazar las "o" por "a" todos los "tre" por "dos" y las "se" por "co", a manera de obtener finalmente un archivo con los siguientes cambios dentro de cnfg.ini

adosco.txt=a1,1,2,2015
adosco.txt=dos1,1,2,2015
adosco.txt=co1,1,2,2015

codosa.txt.txt=co2,1,2,2015
codosa.txt.txt=dos2,1,2,2015
codosa.txt.txt=a2,1,1,2015

coados.txt.txt=co3,1,2,2015
coados.txt.txt=a3,1,2,2015
coados.txt.txt=dos3,1,2,2015

Cabe aclarar que no es necesario que el BAT modifique el nombre de la configuración, solo los archivos correspondientes ej: otrese.txt cambia a adosco.txt de esta manera con todos los archivos para que correspondan en la configuración.

PDT: Ciertamente plantee el ejemplo con un  infinito de archivos, la cantidad real asciende a más 250 con cerca de 15 configuraciones cada una dentro del ini. 

PDT2: Logre solucionar la parte de remplazar las cadenas en el nombre de los txt, solo queda reemplazar lo que está dentro del cnfg.ini

PDT3: Para modificar los *.ini, suelo usar el ren hacia *.txt

Espero haya dado una mejor explicación acerca del problema. Agradesco por su ayuda! 

Esto podría valer, aunque si las sustituciones interfieren entre sí (es decir, si no es posible ordenarlas de forma que una sustitución no interfiera con la siguiente) habría que pensar en otra cosa):

@echo off
Setlocal EnableDelayedExpansion
cd d:\prueba
del /q temp.txt
for %%f in (*.txt) do (
set archivo=%%f
set archivo=!archivo:o=a!
set archivo=!archivo:tre=dos!
set archivo=!archivo:se=co!
rename %%f !archivo!
)
for /f "tokens=* delims=" %%i in (cnfg.ini) do (
set ANT=%%i
set ANT=!ANT:o=a!
set ANT=!ANT:tre=dos!
set ANT=!ANT:se=co!
Echo ! ANT!>>temp.txt
)
Copy /y temp.txt cnfg.ini

Como en la ocasión anterior voy a mostrar mi entorno de pruebas antes y después de ejecutar el bat (sae.bat):

D:\BAT>dir d:\prueba
El volumen de la unidad D es ABR2003
El número de serie del volumen es: 10F6-62F9
 Directorio de d:\prueba
04/07/2016  22:59    <DIR>          .
04/07/2016  22:59    <DIR>          ..
04/07/2016  22:59               247 cnfg.ini
04/07/2016  11:37                96 otrese.txt
04/07/2016  11:37                96 seotre.txt
04/07/2016  11:37                96 setreo.txt
               4 archivos            535 bytes
               2 dirs  27.179.229.184 bytes libres
D:\BAT>type d:\prueba\cnfg.ini
otrese.txt=o1,1,2,2015
otrese.txt=tre1,1,2,2015
otrese.txt=se1,1,2,2015
setreo.txt.txt=se2,1,2,2015
setreo.txt.txt=tre2,1,2,2015
setreo.txt.txt=o2,1,1,2015
seotre.txt.txt=se3,1,2,2015
seotre.txt.txt=o3,1,2,2015
seotre.txt.txt=tre3,1,2,2015
D:\BAT>type sae.bat
@echo off
Setlocal EnableDelayedExpansion
cd d:\prueba
del /q temp.txt
for %%f in (*.txt) do (
set archivo=%%f
set archivo=!archivo:o=a!
set archivo=!archivo:tre=dos!
set archivo=!archivo:se=co!
rename %%f !archivo!
)
for /f "tokens=* delims=" %%i in (cnfg.ini) do (
set ANT=%%i
set ANT=!ANT:o=a!
set ANT=!ANT:tre=dos!
set ANT=!ANT:se=co!
echo !ANT!>>temp.txt
)
copy /y temp.txt cnfg.ini
D:\BAT>sae
No se encuentra D:\prueba\temp.txt
        1 archivos copiados.
D:\BAT>dir d:\prueba
 El volumen de la unidad D es ABR2003
 El número de serie del volumen es: 10F6-62F9
 Directorio de d:\prueba
04/07/2016  23:04    <DIR>          .
04/07/2016  23:04    <DIR>          ..
04/07/2016  11:37                96 adosco.txt
04/07/2016  23:04               249 cnfg.ini
04/07/2016  11:37                96 coados.txt
04/07/2016  11:37                96 codosa.txt
04/07/2016  23:04               249 temp.txt
               5 archivos            786 bytes
               2 dirs  27.179.229.184 bytes libres
D:\BAT>type d:\prueba\cnfg.ini
adosco.txt=a1,1,2,2015
adosco.txt=dos1,1,2,2015
adosco.txt=co1,1,2,2015
codosa.txt.txt=co2,1,2,2015
codosa.txt.txt=dos2,1,2,2015
codosa.txt.txt=a2,1,1,2015
coados.txt.txt=co3,1,2,2015
coados.txt.txt=a3,1,2,2015
coados.txt.txt=dos3,1,2,2015

Mira a ver si puede servir o si necesitas alguna mejora.

Estoy seguro que esto es lo que necesito; como menciona, dependiendo del orden en que se encuentran ordenados los conjuntos serán reemplazados, pero puedo poder encargarme de esto con un orden específico de los conjuntos a remplazar. todo funciona bien sin embargo al ejecutar el archivo me genera el ini con el mensaje "ECHO esta desactivado.", intente usarlo de la manera en que hizo el ejemplo obteniendo el mismo resultado "ECHO esta desactivado.", sera alguna configuracion del ordenador ?

Muchas gracias por la ayuda!

El mensaje "ECHO está desactivado" se produce cuando se hace ECHO para una variable que no contiene nada estando desactivado el comando (mediante @echo off). En esta ocasión la culpa es de un error de la página, que ocurre de vez en cuando, que separó la admiración ("!") de la variable en la línea

Echo ! ANT!>>Temp.txt

según puedes ver más arriba y también en el pantallazo de tu sae.bat mediante el bloc de notas. Debería decir "echo !ANT!>>temp.txt" que es como figura en mi sae.bat como puedes ver en el TYPE que le hice. Como ocurre con cierta frecuencia suelo revisar lo que sale pero no lo hice esta vez porque en la primera respuesta no hubo problemas. Puedes ver que el editor de la página cambia otras cosas (como poner en mayúscula la primera letra de este mismo comando Echo y lo mismo en el Copy) que no afectan al funcionamiento, pero este cambio sí que afecta. Corrígelo y dime si ya todo está en orden.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas