28

我想创建一个批处理,它在批处理文件中找到特定的行并能够编辑这些行。

例子:

//TXT文件//

ex1
ex2
ex3
ex4

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

ex1
ex2
ex5
ex4
4

8 回答 8

30

在本机 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
于 2009-07-12T08:30:23.117 回答
15

在 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
于 2009-07-15T02:49:29.017 回答
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
于 2011-02-03T19:17:29.810 回答
10

如果您在 Windows 上,则可以使用FART 查找替换文本。它只有 1 个 *.exe 文件(不需要库)。

您只需要运行:

fart.exe your_batch_file.bat ex3 ex5
于 2014-10-09T02:57:26.773 回答
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

来源。希望它会帮助一些人。

于 2017-10-04T13:47:00.277 回答
5

这就是为之而生的东西sed(当然,为此您需要在系统上安装 sed)。

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

为此,您将需要 Unix 系统或 Windows Cygwin类型的平台。
还有用于 sed 的 GnuWin32。(GnuWin32安装与使用)。

于 2009-07-12T08:12:54.713 回答
5

您始终可以使用“FAR”=“查找和替换”。它是在 java 下编写的,所以它可以在 Java 工作的地方工作(几乎无处不在)。使用目录和子目录,在文件中搜索和替换,也可以重命名它们。也可以重命名批量文件。Licence = 免费,适用于个人或公司。速度非常快,由开发人员维护。在这里找到它:http: //findandreplace.sourceforge.net/

您也可以使用 GrepWin。工作原理几乎相同。你可以在这里找到它:http ://tools.tortoisesvn.net/grepWin.html

于 2011-12-22T09:23:32.680 回答
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
于 2017-07-06T10:35:36.753 回答