Lote / Buscar y editar líneas en archivo TXT

Quiero crear un lote mientras encuentre líneas específicas en un archivo por lotes y pueda editar estas líneas.

Ejemplo:

// ARCHIVO TXT //

ex1 ex2 ex3 ex4 

Quiero que el archivo por lotes encuentre ‘ex3’ y lo edite a ‘ex5’ para que se vea así:

 ex1 ex2 ex5 ex4 

en una instalación nativa de Windows, puede usar lotes (cmd.exe) o vbscript sin la necesidad de obtener herramientas externas. he aquí un ejemplo en vbscript

 Set objFS = CreateObject("Scripting.FileSystemObject") strFile = "c:\test\file.txt" Set objFile = objFS.OpenTextFile(strFile) Do Until objFile.AtEndOfStream strLine = objFile.ReadLine If InStr(strLine,"ex3")> 0 Then strLine = Replace(strLine,"ex3","ex5") End If WScript.Echo strLine Loop 

guardar como myreplace.vbs y en la línea de comando

 c:\test> cscript /nologo myreplace.vbs > newfile c:\test> ren newfile file.txt 

No hay función de búsqueda y reemplazo ni edición de flujo en la línea de comando en XP o 2k3 (no se conoce la vista o más). Por lo tanto, deberá usar un script como el que publicó Ghostdog, o una herramienta capaz de buscar y reemplazar como sed.

Hay más de una forma de hacerlo, ya que este script muestra:

 @echo off SETLOCAL=ENABLEDELAYEDEXPANSION rename text.file text.tmp for /f %%a in (text.tmp) do ( set foo=%%a if !foo!==ex3 set foo=ex5 echo !foo! >> text.file) del text.tmp 

El ejemplo de ghostdog74 proporcionó el núcleo de lo que necesitaba, ya que nunca antes había escrito vbs y necesitaba hacerlo. No es perfecto, pero desarrollé el ejemplo en un guión completo en caso de que alguien lo encuentre útil.

 'ReplaceText.vbs Option Explicit Const ForAppending = 8 Const TristateFalse = 0 ' the value for ASCII Const Overwrite = True Const WindowsFolder = 0 Const SystemFolder = 1 Const TemporaryFolder = 2 Dim FileSystem Dim Filename, OldText, NewText Dim OriginalFile, TempFile, Line Dim TempFilename If WScript.Arguments.Count = 3 Then Filename = WScript.Arguments.Item(0) OldText = WScript.Arguments.Item(1) NewText = WScript.Arguments.Item(2) Else Wscript.Echo "Usage: ReplaceText.vbs   " Wscript.Quit End If Set FileSystem = CreateObject("Scripting.FileSystemObject") Dim tempFolder: tempFolder = FileSystem.GetSpecialFolder(TemporaryFolder) TempFilename = FileSystem.GetTempName If FileSystem.FileExists(TempFilename) Then FileSystem.DeleteFile TempFilename End If Set TempFile = FileSystem.CreateTextFile(TempFilename, Overwrite, TristateFalse) Set OriginalFile = FileSystem.OpenTextFile(Filename) Do Until OriginalFile.AtEndOfStream Line = OriginalFile.ReadLine If InStr(Line, OldText) > 0 Then Line = Replace(Line, OldText, NewText) End If TempFile.WriteLine(Line) Loop OriginalFile.Close TempFile.Close FileSystem.DeleteFile Filename FileSystem.MoveFile TempFilename, Filename Wscript.Quit 

Si está en Windows, puede usar FART ( F ind y R eplace T ext). Es solo 1 archivo single * .exe (no se necesita biblioteca).

Todo lo que necesitas es ejecutar:

 fart.exe your_batch_file.bat ex3 ex5 

Este es el tipo de cosas para las que sed se creó (por supuesto, necesitas sed en tu sistema para eso).

sed ‘s / ex3 / ex5 / g’ input.txt> output.txt

Necesitarás un sistema Unix o una plataforma tipo Windows Cygwin para esto.
También hay GnuWin32 para sed . ( Instalación y uso de GnuWin32 ).

Siempre puede usar “FAR” = “Buscar y reemplazar”. Está escrito en Java, por lo que funciona donde funciona Java (prácticamente en todas partes). Funciona con directorios y subdirectorios, busca y reemplaza dentro de archivos, también puede cambiarles el nombre. También puede cambiar el nombre de los archivos masivos.Licencia = gratis, tanto para individuos como para compañías. Muy rápido y mantenido por el desarrollador. Encuéntrelo aquí: http://findandreplace.sourceforge.net/

También puedes usar GrepWin. Funciona más o menos igual. Puede encontrarlo aquí: http://tools.tortoisesvn.net/grepWin.html

 @echo off set "replace=something" set "replaced=different" set "source=Source.txt" set "target=Target.txt" setlocal enableDelayedExpansion ( for /F "tokens=1* delims=:" %%a in ('findstr /N "^" %source%') do ( set "line=%%b" if defined line set "line=!line:%replace%=%replaced%!" echo(!line! ) ) > %target% endlocal 

Fuente Esperando que ayude a alguien.

Puedes hacer así:

 rename %CURR_DIR%\ftp\mywish1.txt text.txt for /f %%a in (%CURR_DIR%\ftp\text.txt) do ( if "%%a" EQU "ex3" ( echo ex5 >> %CURR_DIR%\ftp\mywish1.txt ) else ( echo %%a >> %CURR_DIR%\ftp\mywish1.txt ) ) del %CURR_DIR%\ftp\text.txt