Lote / encontrar e editar linhas no arquivo TXT
-
12-09-2019 - |
Pergunta
Eu quero criar um lote enquanto que encontra linhas específicas em um arquivo de lote e são capazes de editar estas linhas.
Exemplo:
// TXT ARQUIVO //
ex1
ex2
ex3
ex4
Eu quero que o achado arquivo de lote 'EX3' e editar este para 'ex5' para deixá-lo parecido com este:
ex1
ex2
ex5
ex4
Solução
Em instalar um Windows nativo, você pode lote uso (cmd.exe) ou VBScript, sem a necessidade de obter ferramentas externas. Aqui está um exemplo em 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
Salvar como myreplace.vbs e na linha de comando:
c:\test> cscript /nologo myreplace.vbs > newfile
c:\test> ren newfile file.txt
Outras dicas
Não há pesquisa e substituição de função ou de edição de fluxo na linha de comando no XP ou 2K3 (não sei sobre o Vista ou além). Então, você vai precisar usar um script como o Ghostdog postado, ou uma pesquisa e substituição ferramenta capaz como sed.
Há mais de uma maneira de fazê-lo, como este script mostra:
@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
O exemplo de ghostdog74 desde que o núcleo do que eu precisava, já que eu nunca escrevi nenhum vbs antes e precisava fazer isso. Não é perfeito, mas eu clarificado, o exemplo em um roteiro completo em alguém acha caso seja ú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
Se você estiver no Windows, você pode usar FART ( F ind
Tudo que você precisa é executado:
fart.exe your_batch_file.bat ex3 ex5
Este é o tipo de coisa sed
foi feito para (claro, você precisa de sed em seu sistema para isso).
sed 's / ex3 / ex5 / g' input.txt> output.txt
Você quer vai precisar de um sistema Unix ou Windows Cygwin tipo de plataforma para isso.
Há também GnuWin32 para sed. ( GnuWin32 instalação e uso ).
Você sempre pode usar "FAR" = "Localizar e substituir". Ele é escrito em Java, por isso funciona em Java trabalha (praticamente em todos os lugares). Funciona com diretórios e subdiretórios, buscas e substitui dentro de arquivos, também pode renomeia-los. Também pode mudar o nome de grandes quantidades files.Licence = livre, tanto para indivíduos ou comapnies. Muito rápido e mantido pelo desenvolvedor. Encontrá-lo aqui: http://findandreplace.sourceforge.net/
Além disso, você pode usar grepWin. Funciona praticamente o mesmo. Você pode encontrá-lo aqui: 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
Você pode fazer assim:
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