在TXT文件中批量查找和编辑行

30
我想创建一个批处理程序,可以查找批处理文件中特定的行,并能够编辑这些行。
例如:
//TXT FILE//
ex1
ex2
ex3
ex4

我想让批处理文件找到“ex3”,并将其编辑为“ex5”,使其看起来像这样:

ex1
ex2
ex5
ex4

21
如果我说“批次(BATCH)”,那听起来很清晰。 - Deniz Zoeteman
8个回答

31

在本机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

15

在XP或2k3中,没有搜索和替换功能或流编辑命令行。所以,你需要使用像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

1
示例中没有空格。 - RobW

11

18
他们必须在结尾处加上“文本”,是吗? :) - akinuri

11

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

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

源代码。希望它能帮助某人。


这个解决方案有时会破坏包含冒号的代码,例如 if variable != (0, 0, 0): => if variable:class:Figure => class:Figure - Martin

5
这就是 sed 的用武之地(当然,你需要在系统上安装sed)。
sed 's/ex3/ex5/g' input.txt > output.txt
你需要一个Unix系统或类似的Windows Cygwin 平台才能使用它。
还有 GnuWin32 for sed。(GnuWin32 安装和使用

这是太多的东西,我需要设置为公共的;所以应该很容易完成。 - Deniz Zoeteman

5
您可以随时使用“FAR”=“查找和替换”功能。它是基于Java编写的,所以几乎可以在Java运行的任何地方运行。它可以处理目录和子目录,并在文件中进行搜索和替换,还可以对它们进行重命名。也可以批量重命名文件。许可证=免费,适用于个人或公司使用。非常快速,由开发人员维护。您可以在此处找到它:http://findandreplace.sourceforge.net/ 另外,您也可以使用GrepWin。它的功能与FAR类似。您可以在此处找到它:http://tools.tortoisesvn.net/grepWin.html

2
您可以这样做:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接