2009-07-12 26 views
22

Deseo crear un lote mientras encuentre líneas específicas en un archivo por lotes y pueda editar estas líneas.Lote/Buscar y editar líneas en el archivo TXT

Ejemplo:

// // ARCHIVO TXT

ex1 
ex2 
ex3 
ex4 

quiero dejar que el archivo por lotes se encontró 'EX3' y editarla para 'ex5' para que se vea así:

ex1 
ex2 
ex5 
ex4 
+20

parece claro si digo'BATCH' –

Respuesta

27

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 comandos

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

Este es el tipo de cosas sed fue hecho para (por supuesto, necesita sed en su sistema para eso).

sed 's/EX3/ex5/g' entrada.txt> salida.txt

Va a tener un sistema Unix o un tipo de Windows Cygwin de plataforma para esto.
También hay GnuWin32 for sed. (GnuWin32 installation and usage).

+0

esto es demasiadas cosas que necesito. Quiero establecer esto público; por lo tanto, debe hacerse fácilmente. –

12

No hay búsqueda y la función o la edición corriente de reemplazar en la línea de comandos en Windows XP o 2k3 (Dont saber acerca de la vista o más allá). 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 manera de hacerlo, ya que este script de muestra: ejemplo

@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 
11

de ghostdog74 proporciona el núcleo de lo que necesitaba, ya que nunca he dejado VBS antes y tenía que hacer eso . 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 <Filename> <OldText> <NewText>" 
    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 
5

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 puede usar GrepWin. Funciona más o menos igual. Lo puedes encontrar aquí: http://tools.tortoisesvn.net/grepWin.html

6

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

Todo lo que necesita es ejecutar:

fart.exe your_batch_file.bat ex3 ex5 
+2

Tenían que pegar ** T ** ext al final, ¿no? :) – akinuri

0

Se puede 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 
2
@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 

Source. Esperando que ayude a alguien.

Cuestiones relacionadas