Mihir
Mihir

Reputation: 557

search and replace string using batch commands

How can i search a string and replace it with a variable. i would like to search version="1.37.0" but the version number could be anything. And there are two "version=" string in package.xml but i would like to replace second one.

how can i search version="x.x.x" and replace it with version="$variable"? is there any one liner?

i did try to use something like this to search:

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

and also same thing for desrciption="$variable1"

package.xml

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

Upvotes: 0

Views: 159

Answers (2)

MC ND
MC ND

Reputation: 70923

ad hoc solution, but ...

Edited to adapt to comments

@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)

Upvotes: 1

SachaDee
SachaDee

Reputation: 9545

Try this :

@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

Very simplist but a good base

Edit :

This will ask for the version value of the second matched 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)

The input file is text.xml and the ouputFile Output.xml

Upvotes: 1

Related Questions