Como puedo reemplazar en un archivo de texto, desde un archivo por lotes (DOS/CMD) un caracter por una comilla doble (")?

Estoy usando las siguientes rutinas para reemplazar caracteres en un archivo de texto a cuyo contenido le doy un par de pasadas para dejar el texto con el formato que necesito. El tema es que funcionan todos menos :INICIO4

El archivo que formateo lo obtengo del comando Write-line de Autocad que no me permite escribir comillas en el archivo de salida, motivo por el cual lo reemplacé por el numeral.

Estuve probando el EDLIN también pero todavía no encontré la vuelta.

Dado que, como tengo que hacer referencia a un path en algunos nombres de carpetas tengo algunos espacios, para que la línea de comandos los reconozca, hay que cerrarlos con comillas. Y hete aquí el problema en cuestión.

:Inicia

:REEMPLAZA_BARRAS

 set cadenaorigen=/

set cadenaorigen=%cadenaorigen:"=%

set cadenasustitucion=-

set cadenasustitucion=%cadenasustitucion:"=%

 set archivo=nombre.txt

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

copy /y kk_temp.txt %archivo%

del /q kk_temp.txt

:Inicia2

:REEMPLAZA_DOS_PUNTOS

 set cadenaorigen=:

set cadenaorigen=%cadenaorigen:"=%

set cadenasustitucion=.

set cadenasustitucion=%cadenasustitucion:"=%

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

type kk_temp.txt

copy /y kk_temp.txt %archivo%

del /q kk_temp.txt

:Inicia3

:quita_espacios

 set cadenaorigen="  "

set cadenaorigen=%cadenaorigen:"=%

set cadenasustitucion=""

set cadenasustitucion=%cadenasustitucion:"=%

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

type kk_temp.txt

copy /y kk_temp.txt %archivo%

del /q kk_temp.txt

:INICIA 4 (no me reemplaza el # por una “ –una comilla doble- sino por un espacio en blanco)

:cambia_por_comillas

set archivo=NO_BORRAR_1.txt

set cadenaorigen=#

set cadenaorigen=%cadenaorigen:"=%

set cadenasustitucion=”

set cadenasustitucion=%cadenasustitucion:"=%

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

type kk_temp.txt

En cuanto al EDLIN intenté hacer lo que explica esta página pero para comillas y no logré hacerlo funcionar.

http://www.lawebdelprogramador.com/foros/Ms-Dos/1042385-Reemplazar-con-edlin.html

1 Respuesta

Respuesta
1

No acabo de entender por qué, en la sustitución problemática (# por "), la variable archivo pasa de ser nombre.txt a NO_BORRAR_1.txt. Si eso es un error prueba con lo siguiente:

:Inicia
:REEMPLAZA_BARRAS
set archivo=nombre.txt
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:/=! >>kk_temp.txt)
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:Inicia2
:REEMPLAZA_DOS_PUNTOS
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT::=.! >>kk_temp.txt)
type kk_temp.txt
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:Inicia3
:quita_espacios
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT: =! >>kk_temp.txt)
type kk_temp.txt
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:INICIA 4 
:cambia_por_comillas
set archivo=NO_BORRAR_1.txt
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:#="! >>kk_temp.txt)
type kk_temp.txt

Cuéntame como te va y analizaremos lo que ocurre.

Perdón, esto es lo que quería poner:

:Inicia
:REEMPLAZA_BARRAS
set archivo=nombre.txt
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:/=! >>kk_temp.txt)
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:Inicia2
:REEMPLAZA_DOS_PUNTOS
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT::=.! >>kk_temp.txt)
type kk_temp.txt
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:Inicia3
:quita_espacios
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT: =! >>kk_temp.txt)
type kk_temp.txt
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:INICIA 4
:cambia_por_comillas
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:#="! >>kk_temp.txt)
type kk_temp.txt

nombre.txt lo uso para setear fecha y hora pero a ese valor debo cambiarle los ":" por "." y las barras "/" por "-".

El problema es "NO_BORRAR1.TXT" donde guardo el string de un path donde buscar ciertos logs de una aplicación de Autocad y cuyo contenido siempre varía. El problema es que es path (creado por Autocad) tienen un nombre con espacios en el medio. Por eso es necesario cerrar todo el path con comillas dobles.

No te entiendo muy bien. Solo que el mismo bat trata dos archivos distintos, nombre.txt y NO_BORRAR1.TXT, algo que no contemplaba mi propuesta (aparte de que creo que no adapté bien el cambio de barras "/" por "-"). Si te he entendido bien esto si que debería funcionar:

:Inicia
:REEMPLAZA_BARRAS
set archivo=nombre.txt
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:/=-! >>kk_temp.txt)
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:Inicia2
:REEMPLAZA_DOS_PUNTOS
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT::=.! >>kk_temp.txt)
type kk_temp.txt
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:Inicia3
:quita_espacios
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT: =! >>kk_temp.txt)
type kk_temp.txt
copy /y kk_temp.txt %archivo%
del /q kk_temp.txt
:INICIA 4 
:cambia_por_comillas
set archivo=NO_BORRAR_1.txt
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&echo !ANT:#="! >>kk_temp.txt)
type kk_temp.txt

No te preocupes por todas las rutinas que sí funcionan sin problemas, solo no funciona la parte que empieza con :INICIO4.

Básicamente tengo un archivo por lotes inicial mas 3 archivos TXT generados por Autolisp (lenguaje de Autocad). El BAT inicial + nombres.txt+NO_BORRAR1.TXT + NO_BORRAR2.TXT me generan un segundo .BAT (en realidad .CMD) que es el que me recupera una serie de archivos locales y otros en un servidor, para armar un paquete y enviarlos por correo. 

Probé tu cambio (:INICIO4) pero no hay caso, no hace nada. Igual ya me desconecté de la oficina por la hora así que hasta la semana que viene no puedo hacer más pruebas. Mientras tanto veré si no hay algún aplicativo freeware que haga reemplazos como éste (aunque siempre trato de no depender de aplicaciones de terceros). 

Prueba con esto:

@echo off
Setlocal EnableDelayedExpansion
del kk_temp.txt
set archivo=NO_BORRAR_1.txt
for /f "tokens=* delims=" %%i in (%archivo%) do (set ANT=%%i&set ANT=!ANT:#="!
echo !ANT! >> kk_temp.txt)
type kk_temp.txt

No unas el comando ECHO a la línea del DO (mediante "&") porque por alguna extraña razón eso hace que el ECHO no funcione. Prueba con un NO_BORRAR_1.TXT fabricado por ti que tenga "#" y verás como los convierte correctamente en dobles comillas

M.

A.

E.

S.

T.

R.

O.

! ! !

A hora sí! Hay que documentarlo y cambiar en esa rutina de reemplazo para que se conozca este "detalle". Este martes (aquí el lunes es feriado) probaré en el archivo por lotes. En mi casa me hice uno de prueba y aquí funcionó. Todavía me faltaría saber si se puede (aunque no encontré nada) alguna forma de obtener "n" caracteres de la izquierda o de la derecha de una cadena. Luego haré otra pregunta sobre este tema. MILLÓN DE GRACIAS.

Me alegro mucho de que te sirva.

También he encontrado una manera de poder pasar la doble comilla como parámetro y es que sea el último parámetro de los pasados. Pero eso resulta un poco forzado para un bat de cambio de cadenas de tipo general. Quiero decir que si el bat espera recibir primero el archivo (o conjunto de archivos) luego la cadena a sustituir y por último la cadena sustituidora (en lugar del diseño actual que espera al archivo como último parámetro) se podría tratar correctamente la doble comilla como sustituidora. Pero no valdría como sustituida.

Y también he visto que hay alguna manera de conseguir que funcione con el EDLIN aunque también he tenido que modificar la forma de uso que tenía para hacer las sustituciones con ese programa.

¡Gracias! Por tu aporte!! La semana que viene me dedicaré a optimizar las rutinas cuando logre que funcione correctamente todo el conjunto. Buen fin de semana!!

Espero que te haya funcionado. En realidad contesto para no tener pendiente de respuesta esta pregunta. No hace falta que digas nada.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas