【问题标题】:Find and Replace string in a text file在文本文件中查找和替换字符串
【发布时间】:2016-09-15 14:14:25
【问题描述】:

我必须使用 Windows 命令/批处理脚本替换文本文件 (InputFile.txt) 中的字符串。我找到了以下脚本 (replace.cmd),但它没有给我准确的结果。

InputFile.txt:

1111 aaaa
2222 bbbb
$cc = 3333

我用来将$cc = 3333 替换为cc = 4444 的批处理脚本(replace.cmd)是:

@echo OFF 
setlocal enabledelayedexpansion

set "search=$cc = 3333"
set "replace=cc = 4444"
set "textfile=InputFile.txt"
set "newfile=OutputFile.txt"
(for /f "delims=" %%i in (%textfile%) do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    echo(!line!
    endlocal
))>"%newfile%"

运行代码后我得到的输出是:

1111 aaaa
2222 bbbb
3333=cc = 4444= 3333

应该是这样的:

1111 aaaa
2222 bbbb
cc = 4444

【问题讨论】:

  • 您是真的使用“MS-DOS”还是指的是Windows中的命令行?
  • 您正在使用的脚本并非旨在使用包含 = 字符的搜索字符串。要测试脚本,将搜索字符串替换为 set search=2222 bbbb 并将替换为 set replace=$%RANDOM%
  • 你会用Vbscript吗?
  • 一点点,简单的搜索将对此大有帮助。怎么样? stackoverflow.com/questions/60034/…
  • 你想总是替换整行,还是部分字符串?还有别的:你不应该为批处理文件使用名称replace,因为还有一个这样命名的命令...

标签: windows batch-file cmd


【解决方案1】:

如果你想要一个像这样的 vbscript 的小技巧:

@echo off
set "Data=some data .... $cc = 3333"
echo The data before replacing is "%Data%" & pause
set "String1=$cc = 3333"
set "String2=cc = 4444" 
Call :ReplaceString "%Data%" "%String1%" "%String2%"
echo The data after replacing is "%Data%" & pause & exit
::*************************************************************************************
:ReplaceString <Data> <String1> <String2>
(
    echo Wscript.echo Replace("%~1","%~2","%~3"^)
)>"%tmp%\%~n0.vbs"
for /f "delims=" %%a in ('Cscript /nologo "%tmp%\%~n0.vbs"') do ( set "Data=%%a" )
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
exit /b
::*************************************************************************************

编辑:15/09/2016 @ 19:30

@echo off
Set "InputFile=%~dp0InputFile.txt"
Set "OutputFile=%~dp0OutputFile.txt"
set "String1=$cc = 3333"
set "String2=cc = 4444" 
if exist "%OutputFile%" Del "%OutputFile%"
Setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('Type "%InputFile%"') do (
    If /I "%%i" == "%String1%" (
        Call :ReplaceString "%%i" "%String1%" "%String2%"
        echo !Data!
        ) else (
        echo %%i
    )
)>> "%OutputFile%"
start "" "%OutputFile%" & exit
::*************************************************************************************
:ReplaceString <Data> <String1> <String2>
(
    echo Wscript.echo Replace("%~1","%~2","%~3"^)
)>"%tmp%\%~n0.vbs"
for /f "delims=" %%a in ('Cscript /nologo "%tmp%\%~n0.vbs"') do ( set "Data=%%a" )
If Exist "%tmp%\%~n0.vbs" Del "%tmp%\%~n0.vbs"
exit /b
::*************************************************************************************

【讨论】:

    【解决方案2】:

    我们需要一位专家!他/她当然知道如何做到这一点。

    替换包含= 符号的字符串很棘手。据我所知,您必须一分为二并测试这两个术语,或者,如果要搜索的字符串是固定的,请尝试

    @echo off
    
    set "search=$cc = 3333"
    set "replace=cc = 4444"
    set "textfile=InputFile.txt"
    set "newfile=OutputFile.txt"
    
    >"%newfile%" (
      for /f "delims=" %%i in (%textfile%) do (
        if "%%i" equ "%search%" (
          echo(%replace%
        ) else (
          echo(%%i
        )       
      )
    )
    exit/B
    

    【讨论】:

      【解决方案3】:

      只需更改您的 for 循环:

      @echo off
      
      set "search=$cc = 3333"
      set "replace=cc = 4444"
      set "textfile=InputFile.txt"
      set "newfile=OutputFile.txt"
      
      >"%newfile%" (for /f "delims=" %%i in (%textfile%) do (
              If /I "%%i" Equ "%search%" (Echo=%replace%) Else (Echo=%%i)))
      exit/B
      

      【讨论】:

        猜你喜欢
        • 2011-05-25
        • 2013-02-19
        • 2020-08-12
        • 2013-11-28
        • 1970-01-01
        • 2021-05-21
        • 2019-11-03
        • 1970-01-01
        • 2016-09-22
        相关资源
        最近更新 更多