使用文本文件的输入批处理查找和替换

时间:2014-02-15 22:58:42

标签: batch-file cmd

我正在尝试创建一个批处理文件,它将找到一个字符串并将其替换为来自记事本文件的字符串

例如:

我在XYZ.txt中有以下内容

< Xml 3.0>
设置bjuih
fjgfgfr
GA JHJA KSKASA
设置Oid值=' 1.2.3.456.7 '
gshdasdsad

我希望将粗体中提到的数字替换为来自名为ABC.txt的文件的值

我能够写下面的代码;但它没有按预期工作。

@echo off
SET InFile=C:\Test\Apple\XYZ.txt
FOR /F "tokens=*" %%A IN ('FINDSTR "1.2.3.456.7 "%InFile%"') DO CALL :FindString "%%A"
pause
goto :eof
:FindString
SET String=%~1
SET String=%String:1.2.3.456.7=abc%
echo.%String%>C:\Test\Apple\XYZ.txt

尽快帮助解决此问题。

3 个答案:

答案 0 :(得分:0)

我不知道如何在普通的cmd批处理文件中执行此操作,但如果您可以使用PowerShell,我之前遇到过类似的问题,我在此处记录了解决方案:

http://tangodude.wordpress.com/2013/04/15/powershell-multiple-find-replace-in-files-with-lookup-list/

PowerShell代码段是:

Param (
    [String]$List = "ReplacementList.csv",
    [String]$Files = ".\Files\*.*"
)
$ReplacementList = Import-Csv $List;
Get-ChildItem $Files |
ForEach-Object {
    $Content = Get-Content -Path $_.FullName;
    foreach ($ReplacementItem in $ReplacementList)
    {
        $Content = $Content.Replace($ReplacementItem.OldValue, $ReplacementItem.NewValue)
    }
    Set-Content -Path $_.FullName -Value $Content
}

答案 1 :(得分:0)

@ECHO OFF
SETLOCAL
SET "sourcedir=."
(
 FOR /f "delims=" %%a IN ('type "%sourcedir%\abc.txt"') DO (
  SET "replacement=%%a"
  FOR /f "delims=" %%b IN ('type "%sourcedir%\xyz.txt"') DO (
   SET "line=%%b"
   CALL :subs
   IF DEFINED line ECHO %%b
  )
 )
)>newfile.txt

GOTO :EOF

:subs
SET "newline=%line:SET Oid value=%"
IF "%newline%"=="%line%" GOTO :EOF
SET "line="
ECHO Set Oid value = '%replacement%'
GOTO :eof

此批处理只是将文件重建为newfile.txt。我使用.作为目标 - 您需要替换目录名。

请注意,您无法就地更新文件 - 您必须创建一个新文件newfile.txtand then移动it over the original version ( move / y`将替换为问)。

答案 2 :(得分:0)

测试一下:

@echo off
>abc.txt echo 888.777.666
SET "InFile=C:\Test\Apple\XYZ.txt"
FOR /F "usebackq delims=" %%A IN ("abc.txt") do set "newstring=%%A"
FOR /F "usebackq delims=" %%A IN ("%InFile%") DO CALL :FindString "%%A"
move newfile.txt "C:\Test\Apple\XYZ.txt"
pause
goto :eof
:FindString
SET "String=%~1"
if not "%string:Set Oid value=%"=="%string%" (
      >>newfile.txt echo Set Oid value = '%newstring%'
  ) else (
      for %%z in ("%~1") do >>newfile.txt echo %%~z
)