el signo =

Iniciado por Orni1, 16 Septiembre 2017, 13:49 PM

0 Miembros y 1 Visitante están viendo este tema.

Orni1

Vengo leyendo y aprendiendo del gran post http://foro.elhacker.net/scripting/acciones_sobre_archivos_de_texto_batch-t242748.0.html

pretendo cambiar un texto por otro, en el tema citado está este código:

Citar@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('type texto.txt') do (
set linea=%%x
set linea=!linea:Perl=C!
call :show !linea!
)
goto:eof
:show
echo %* >> out.txt
goto:eof

El código funciona perfecto pero tengo un problema siguiendo con ejemplo mi texto seria

Perl=CCCC

y lo que quiero eliminar es Perl= y cambiarlo por HT de tal modo que en esa linea quede HTCCCC


Con ejemplo el código sería


Citar@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('type texto.txt') do (
set linea=%%x
set linea=!linea:Perl==HT!
call :show !linea!
)
goto:eof
:show
echo %* >> out.txt
goto:eof

Pero no funciona por el signo =

¿Hay manera de escribir el signo = y que lo reconozca como texto no como parte del codigo?

**Aincrad**

listo solo tienes que colocar el signo ^  para que te reconozca el = como texto.

asi:
Código (bash) [Seleccionar]

@echo off
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('type texto.txt') do (
set linea=%%x
set linea=!linea:Perl=^=ht!
call :show !linea!
)
goto:eof
:show
echo %* >> out.txt
goto:eof

prueba el code a ver si es lo que quieres.




Orni1

Muchas gracias por el intento, pero a mi no me funciona. Eso me cambia el texto "Perl=" por "=ht="

Debería ser solo ht quitando el signo =

Por si sirve de algo estoy con win 10

**Aincrad**

a ver, que es precisamente lo que quieres?




Orni1

Que el signo = del texto original desparezca

En el texto original pone:
version=85045

Quiero que se cambie version= (incluyendo el =) por HT.

Quedando el texto así: HT85045

**Aincrad**

ya lo he terminado. comenta si te funciono.

code:
Código (bash) [Seleccionar]

@echo off
set n=HT
setlocal enabledelayedexpansion
for /f "tokens=* delims=" %%x in ('type texto.txt') do (
set linea=%%x
set linea=!linea:version=%n%!
call :show !linea!
)
goto foroelhacker.net

:foroelhacker.net
Setlocal EnableDelayedExpansion
Mode Con Cols=100 Lines=25
If Exist "%TMP%\BMCTP" (
Goto Inicio
) Else (
MD "%TMP%\BMCTP"
Goto Inicio
)

:Inicio
Set Ruta=%CD%
CD %Ruta%

:Nombre_Texto
Echo. & Echo =======================================================
Echo Escriba el nombre del archivo a modificar (Solo archivos de texto plano "txt"):
Set "Archivo=out"
Cls
If Not Exist "%Archivo%.txt" (
Cls
Echo No se ha encontrado el archivo solicitado, intente nuevamente.
Goto Nombre_Texto
) Else (
Cls
Echo Archivo encontrado.
Goto Backup
)

:Backup
Copy /Y "%Ruta%\%Archivo%.txt" "%TMP%\BMCTP\%Archivo%_Backup.txt" >nul
If Exist "%TMP%\BMCTP\%Archivo%_Backup.txt" (
Echo. & Echo =======================================================
Echo Backup realizado con exito.
>Nul Ping -n 3 Localhost & Cls & Goto Caracter
) Else (
Cls
Echo Error al hacer Backup del archivo.
Pause>nul
Exit
)

:Caracter
Set Caracter=^=
If "%Caracter%" == "" Cls & Echo Por favor no intente ingresar valores nulos... & Echo. & Goto Caracter
Cls & >Nul Ping -n 1 Localhost

:Mod
Set PosX=0
For /F "Usebackq Tokens=*" %%a IN ("%Ruta%\%Archivo%.txt") Do (
Set Linea=%%a
Call:Buscador
Set "LineaNueva="
)
Goto Aprobacion

:Buscador
If Not "%Caracter%" == "!Linea:~%PosX%,1!" (
If "!Linea:~%PosX%,1!" == "" (
Set PosX=0
Echo !LineaNueva!>>"%TMP%\BMCTP\Nuevo_%Archivo%.txt"
Goto:Eof
)
Set "LineaNueva=%LineaNueva%!Linea:~%PosX%,1!"
Set /A PosX+=1
Goto Buscador
) Else (
If "!Linea:~%PosX%,1!" == "" (
Set PosX=0
Echo !LineaNueva!>>"%TMP%\BMCTP\Nuevo_%Archivo%.txt"
Goto:Eof
)
Set /A PosX+=1
Goto Buscador
)

:Aprobacion
Goto Fin

:Fin
del /f /q out.txt
Cls & Echo.
Copy /Y "%TMP%\BMCTP\Nuevo_%Archivo%.txt" "%Ruta%\%Archivo%.txt" >nul
>Nul Ping -n 1 Localhost
Del /Q "%TMP%\BMCTP" >nul
Echo El archivo modificado se encuentra en : "%Ruta%".
Echo El archivo Back-Up se encuentra en : "%TMP%\BMCTP".
Echo. & Echo Hemos terminado!
Echo. & Echo Saliendo...
>Nul Ping -n 2 Localhost & Exit

:show
echo %* >> out.txt
goto:eof



lo que hace es buscar en el archivo texto.txt las palabras version=85045 y te las cambia a HT85045 . justo lo que querias ,

       comenta si te funciono   ;-)




Orni1

Ya lo creo que funcionó muchísimas gracias   ;-)  ;-)
Ademas es bonito y elegante. No solo me ha servido sino que voy a estudiarlo para aprender un poco mas aunque no os llego a suela del zapato.

**Aincrad** muchas gracias por tu tiempo y tu saber.

**Aincrad**

dale no es nada.  :)

si no entiendes alguna parte de el code me avisas, con gusto te lo explicare.   ;)




Eleкtro

#8
Hola. Batch no está pensado como un lenguaje (de hecho tecnicamente no es un lenguaje de programación) para parsear archivos de texto. En tu script, estás iterando linea por linea y tratando de realizar el reemplazamiento de string en cada una de las lineas, aparte de eso en lugar de escribir de una sola vez el archivo, estás adjuntando la última linea iterada al final del archivo de texto, todo esto en términos de rendimiento/velocidad de ejecución deja mucho que desear, y el agravío lo notarías si se tratase de un archivo con varios miles de lineas...

En fin, a donde quiero llegar es que Batch está desfasado para este tipo de tareas, y hay que ir inculcando a las nuevas generaciones la forma más óptima de resolver ciertos problemas, por eso en lugar de Batch yo te sugiero utilizar PowerShell.

La solución a tu problema:

script.ps1
Código (ini) [Seleccionar]
[System.Reflection.Assembly]::LoadWithPartialName("System.Text.dll")

$srcFilePath  = ".\Iput Text.txt"
$dstFilePath  = ".\Output Text.txt"
$textEncoding = [System.Text.Encoding]::Default

$filecontent  = [System.IO.File]::ReadAllText($srcFilePath, $textEncoding)
$replacedText = ($filecontent).Replace("Perl=", "HT")

[System.IO.File]::WriteAllText($dstFilePath, $replacedText, $textEncoding)

Write-Host $replacedText
Exit(0)


Saludos.








Orni1

Muchas gracias Elektro.
Mi problema es tengo una base muy pequeña con batch y pese a que no entiendo la mayoría de las cosas fuera de los comandos simples, con la lectura en el foro y copiando los aportes de otros usuarios soy capaz de construir algo medianamente funcional que seguro no es nada correcto pero llega a funcionar. De otro modo lo que tu presentas para mi es totalmente desconocido.

Mi desconocimiento es tal que todavía no soy capaz de saber como es posible que el código del compañero funcione y me quite los signos "=" así que imagina la importancia que para mi pueden tener unos segundos mas o menos cuando antes no podía hacerlo correr de ningún modo.

Te reirías si supieras los meses que llevo dando vueltas al código tratando de hacerlo por mi cuenta y para tener algo que mostrar a la hora de preguntar, para mi ya solo con que me quite los signos de = es un triunfo de muchas horas de trabajo por mi incapacidad en este terreno pero voy aprendiendo.

Entiendo que es un código obsoleto y que hay otras opciones mas actuales y mejores, pero si tengo que ir a algún sitio y me das la opción de conducir en mi coche viejo o en el deportivo mas potente y mas moderno elegiré el coche viejo que aunque no soy piloto se como conducirlo mas o menos.

Si que te agradeceré algún enlace donde poder iniciarme en Power Shell porque me gusta aprender y ademas que me indiques como hago uso de lo que propones, quiero decir... copio el código lo pego en un archivo de texto y que extensión debo ponerle.