Пакет / Найти и редактировать строки в TXT файле - PullRequest
25 голосов
/ 12 июля 2009

Я хочу создать пакет, который находит определенные строки в пакетном файле и может редактировать эти строки.

Пример:

// TXT FILE //

ex1
ex2
ex3
ex4

Я хочу, чтобы пакетный файл нашел 'ex3' и отредактировал его до 'ex5', чтобы он выглядел так:

ex1
ex2
ex5
ex4

Ответы [ 8 ]

30 голосов
/ 12 июля 2009

При нативной установке Windows вы можете использовать batch (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
13 голосов
/ 15 июля 2009

Нет функции поиска и замены или редактирования потока в командной строке в 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
11 голосов
/ 03 февраля 2011

Пример 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
7 голосов
/ 09 октября 2014

Если вы используете Windows, вы можете использовать FART ( F ind A nd R eplace T внутр). Это всего 1 файл * .exe (библиотека не требуется).

Все, что вам нужно, это запустить:

fart.exe your_batch_file.bat ex3 ex5
5 голосов
/ 22 декабря 2011

Вы всегда можете использовать «FAR» = «Найти и заменить». Он написан под Java, поэтому он работает там, где работает Java (почти везде). Работает с каталогами и подкаталогами, ищет и заменяет файлы, также может переименовывать их. Также можно переименовать массовые файлы. Лицензия = бесплатная, как для частных лиц, так и для компаний. Очень быстро и поддерживается разработчиком. Найдите это здесь: http://findandreplace.sourceforge.net/

Также вы можете использовать GrepWin. Работает практически так же. Вы можете найти его здесь: http://tools.tortoisesvn.net/grepWin.html

5 голосов
/ 12 июля 2009

Это то, для чего был создан sed (для этого, конечно, в вашей системе требуется sed).

sed 's / ex3 / ex5 / g' input.txt> output.txt

Для этого вам потребуется либо система Unix, либо платформа Windows Cygwin .
Существует также GnuWin32 для sed . ( Установка и использование GnuWin32 ).

4 голосов
/ 04 октября 2017
@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

Источник . Надеюсь, это кому-нибудь поможет.

1 голос
/ 06 июля 2017

Вы можете сделать так:

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
...