Batch / поиск и редактирование строк в TXT-файле
Я хочу создать пакет, который находит определенные строки в пакетном файле и может редактировать эти строки.
Пример:
/ / TXT-ФАЙЛ/ /
ex1
ex2
ex3
ex4
Я хочу, чтобы пакетный файл нашел 'ex3' и изменил его на 'ex5', чтобы он выглядел следующим образом:
ex1
ex2
ex5
ex4
8 ответов:
В собственной установке Windows можно использовать пакетную установку (cmd.exe) или vbscript без необходимости получения внешних инструментов. вот пример из 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
Сохранить как myreplace.vbs и в командной строке
c:\test> cscript /nologo myreplace.vbs > newfile c:\test> ren newfile file.txt
В XP или 2k3 нет функции поиска и замены или редактирования потока в командной строке (не знаю, как в vista или за ее пределами). Итак, вам нужно будет использовать скрипт, подобный тому, который опубликовал Ghostdog, или инструмент поиска и замены, такой как sed.
Существует несколько способов сделать это, как показывает этот скрипт:
@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
Пример Ghostdog74 предоставил ядро того, что мне было нужно, так как я никогда не писал никаких vbs раньше и нуждался в этом. Это не идеально, но я развил пример в полный сценарий на случай, если кто-то сочтет его полезным.
'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
Если вы находитесь на Windows, вы можете использовать пердеть (F ind A nd R eplace T ext). Это всего лишь 1 сингл *.exe-файл (библиотека не требуется).
Все, что вам нужно, это запустить:
fart.exe your_batch_file.bat ex3 ex5
Вот такая штука
sed
было сделано для (Конечно, вам нужно sed на вашей системе для этого).Sed 's/ex3/ex5/g' вход.txt > вывод.txt
Для этого вам понадобится либо система Unix, либо Платформа Windows Cygwin.
Существует также GnuWin32 для sed . (Установка и использование GnuWin32 ).
Вы всегда можете использовать "FAR" = "Find and Replace". Он написан под java, поэтому он работает там, где работает Java (почти везде). Работает с каталогами и подкаталогами, выполняет поиск и замену внутри файлов, а также может переименовывать их. Также можно переименовывать объемные файлы.Лицензия = бесплатно, как для отдельных лиц, так и для компаний. Очень быстро и поддерживается разработчиком. Найдите его здесь: http://findandreplace.sourceforge.net/
Также Вы можете использовать GrepWin. Работает примерно так же. Вы можете найти это здесь: 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
Источник . Надеясь, что это кому-то поможет.