如何使用 Windows CMD 搜索和替换多个文本文件(目录内)中的字符串?

Car*_* H. 7 windows text-editing command-line find-and-replace

我在一个目录中有多个文本文件,我想将每个出现的字符串1 setlinewidth 替换10 setlinewidth。如何通过 Windows cmd 执行此操作?请帮忙。

小智 8

Powershell 具有无需下载任何外部软件或实用程序即可解决此问题的实用程序。看看脚本专家的这篇文章,非常不错。另外我想说看看Set-Content文档。

例子:

(Get-Content C:\Scripts\Test.txt) | Foreach-Object {$_ -replace "oldString", "newString"} | Set-Content C:\Scripts\Test.txt


Sco*_*ney 6

如果您可以安装第三方实用程序,则 Gnu sed是为此类操作量身定制的。该链接指向托管在 Sourceforge 上的 Windows 版本,您可以下载和安装。这将是提示符处的语法:

for %i in (*.txt) do sed -i "s/1 setlinewidth/10 setlinewidth/g" %i
Run Code Online (Sandbox Code Playgroud)

注意:使用该-i选项,sed 将覆盖有问题的文件,因此请确保您有易于使用的备份,以防出现问题。

如果您无法安装 sed 实用程序,那么仅使用内置的批处理语言将变得更加困难。

编辑:我将一个小的批处理文件放在一起,无需任何外部工具即可执行替换。将其另存为foo.cmd或任何您喜欢的名称,然后从命令行调用它:foo.cmd

警告:这是根据您问题中的示例非常具体地编写的。如果之前/之后的行首或行尾有其他文本甚至多余的空格,则1 setlinewidth此批处理文件将不起作用。这也将保存原始文本文件的副本,扩展名为 .bak(例如 textfile.txt.bak)。

@echo off
setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION

for %%a in (*.txt) do (
    echo Processing %%a...
    for /f "delims=^ tokens=1" %%i in (%%a) do (
        if /i "%%i"=="1 setlinewidth" (
            echo 10 setlinewidth>>%%a.new
        ) else (
            echo %%i>>%%a.new
        )
    )
    move /y %%a %%a.bak > nul
    ren %%a.new %%a
)
Run Code Online (Sandbox Code Playgroud)