【问题标题】:search and replace string using batch commands使用批处理命令搜索和替换字符串
【发布时间】:2014-09-24 18:18:20
【问题描述】:

如何搜索字符串并将其替换为变量。 我想搜索 version="1.37.0" 但版本号可以是任何东西。 package.xml 中有两个 "version=" 字符串,但我想替换第二个。

如何搜索 version="x.x.x" 并将其替换为 version="$variable"? 有没有一个班轮?

我确实尝试过使用类似的东西来搜索:

findstr "version="[0-9].[0-9].[0-9]" package.xml

desrciption="$variable1" 也一样

package.xml

<?xml version="1.0" encoding="utf-8"?>
<PackageManifest>
  <Package name="audio"
           description="something.  . .."
           version="1.37.0"
           comment="">
   </Package>
</PackageManifest>

【问题讨论】:

  • 不,没有单行。请提供一个包含您的目标字符串的样本,否则我们可能会猜测。还有哪些其他标准可以确定要替换的字符串的选择?
  • 抱歉忘了说,目标字符串可以是任何东西,例如 1.1.1、1.23.2、1.23.233。搜索将是最难的事情,但替换只是一个变量,它可能具有以下示例版本。

标签: batch-file search replace


【解决方案1】:

临时解决方案,但是...

已编辑以适应 cmets

@echo off

    setlocal enableextensions disabledelayedexpansion

    rem Check input parameters. Needed the input file, the version and the description
    if "%~3"=="" goto :eof

    set "file=%~1"
    set "newVersion=%~2"
    set "newDescription=%~3"

    rem Read the file into memory
    for /f "tokens=1,* delims=:" %%a in ('findstr /n "^" "%file%"') do (
        set /a "line=1000+%%a*10"
        setlocal enabledelayedexpansion
        for %%c in (!line!) do endlocal & set "l_%%c=|%%b"
    )

    rem %%a will search the required lines
    rem %%c remove blanks at the start of the line
    rem %%d get the key name

    for /f "tokens=2,* delims=_=|" %%a in (
        'set l_1 ^| findstr /i /r /c:"^[^<]*version=" /c:"description=" /c:"^[^<]*<Package"'
    ) do for /f %%c in ("%%b") do for /f "delims==" %%d in ("%%c") do (

        if /i "%%d"=="description"     ( set "value=%newDescription%" & set "newDescription="
        ) else if /i "%%d"=="version"  ( set "value=%newVersion%"     & set "newVersion="
        ) else if /i "%%d"=="<Package" ( set "packageLine=%%a"        & set "value="
        ) else set "value="

        if defined value ( setlocal enabledelayedexpansion
            for /f "delims=" %%z in ("!value!") do ( endlocal 
                for /f tokens^=1^,2^,^*^ delims^=^" %%e in ("%%b") do set "l_%%a=|%%e"%%z"%%g"
            )
        )
    )

    rem Include the missing values
    set /a "packageLine+=1"
    if defined newDescription set "l_%packageLine%=|           description="%newDescription%""
    set /a "packageLine+=1"
    if defined newVersion set "l_%packageLine%=|           version="%newVersion%""


    rem Output the changed information to console
    for /f "tokens=1,* delims=|" %%a in ('set l_1') do echo(%%b

    rem Save to file
    >"%file%" (for /f "tokens=1,* delims=|" %%a in ('set l_1') do echo(%%b)

【讨论】:

  • @Mihir set "file=%~1" , set "version=%~2" 然后调用 doChanges.cmd "c:\somewhere\file.xml" "1.2.3.4"。根据需要调整描述更改
  • 再次感谢。抱歉,有什么方法可以在更改后保存相同的文件..
  • @Mihir,取消批注最后一行
  • @Mihir,代码随更改而更新。有用吗?
  • 如何检查是否存在?如果它不存在,它会添加到 xml 文件中。例如 xml 文件中不存在“version=”,因此它会在该行中添加变量。
【解决方案2】:

试试这个:

@echo off

set $FindStr=Version="x.x.x"
set $ReplString=Version="y.y.y"

setlocal enabledelayedexpansion
for /f "delims=" %%a in ('type test.xml') do (
   set $Ver=%%a
   set $Ver=!$Ver: =!
   If /i !$Ver!==%$FindStr% set $Ver=%$ReplString%
   echo !$Ver! ) >> Output.xml

非常简单但很好的基础

编辑:

这将询问第二个匹配的version=的版本值

@echo off

set "$FindStr=Version="
set $c=1
setlocal enabledelayedexpansion
for /f "delims=" %%a in ('type test.xml') do (
   set $Ver=%%a
   set $Ver=!$Ver: =!
   If /i "!$Ver:~0,8!"=="%$FindStr%" (
        if  !$c! GTR 1 (
             set /p "$NewVer=Enter New version : "
             set $Ver=%$FindStr%!$NewVer!)
        set /a $c+=1)
   echo !$Ver! >> Output.xml)

输入文件为text.xml,输出文件为Output.xml

【讨论】:

  • 非常感谢您的帮助,但“x.x.x”可以是任何东西。它可能是“1.1.1”、“1.2.33”。 “12.22.222”不是固定的。
  • 那么如何测试呢?
  • 嗯?基本上我想要一个可以搜索“version="1.22.334”的脚本,版本号可以是任何东西。用户运行脚本并传递一个新版本号的变量。
  • 好的! Version 的值不重要吗?你只是想改变它?
  • 是的,假设版本的值是未知的。很抱歉造成混淆:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-19
  • 1970-01-01
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多