windows - Batch-kommando for at finde/erstatte tekst inde i filen

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en skabelonfil (siger myTemplate.txt), og jeg skal lave nogle redigeringer for at oprette min egen fil (say myFile.txt) fra denne skabelon.


Så skabelonen indeholder linjer som


env.name=
env.prop= 
product.images.dir=/opt/web-content/product-images


Nu ønsker jeg at dette skal erstattes som følger;


env.name=abc
env.prop=xyz
product.images.dir=D:/opt/web-content/product-images


Så jeg leder efter batchkommandoer til at gøre følgende;


1. Open the template file.
2. Do a kind of find/replace for the string/text
3. Save the updates as a new file


Hvordan opnår jeg dette?

Bedste reference


Den nemmeste rute er at ændre din skabelon for at se sådan ud:


env.name=!env.name!
env.prop=!env.prop!
product.images.dir=/opt/web-content/product-images


Og brug derefter en FOR-loop til at læse og skrive filen, mens forsinket udvidelse er aktiveret:


@echo off
setlocal enableDelayedExpansion
set "env.name=abc"
set "env.prop=xyz"
(
  for /f "usebackq delims=" \%\%A in ("template.txt") do echo \%\%A
) >"myFile.txt"


Bemærk, at det er meget hurtigere at bruge en over-skrive omdirigering > for hele sløjfen, så det er at bruge tilføjes omdirigering >> i sløjfen.


Det ovenstående antager, at ingen linjer i skabelonen begynder med ;. Hvis de gør det, skal du ændre indstillingen FOR EOL til et tegn, der aldrig starter en linje. Måske lige - for /f "usebackq eol== delims="


Også ovenstående forudsætter, at skabelonen ikke indeholder nogen blanke linjer, som du behøver bevaret. Hvis det er, kan du ændre ovenstående som følger (dette eliminerer også et eventuelt EOL problem)


@echo off
setlocal enableDelayedExpansion
set "env.name=abc"
set "env.prop=xyz"
(
  for /f "delims=" \%\%A in (`findstr /n "^" "template.txt"') do (
    "set ln=\%\%A"
    echo(!ln:*:=!
  )
) >"myFile.txt"


Der er en sidste potentielle komplicerende is - du kan have problemer, hvis skabelonen indeholder ! og ^ bogstaver. Du kunne enten undslippe chars i skabelonen, eller du kunne bruge nogle ekstra substitution.


template.txt


Exclamation must be escaped^!
Caret ^^ must be escaped if line also contains exclamation^^^!
Caret ^ should not be escaped if line does not contain exclamation point.
Caret !C! and exclamation !X! could also be preserved using additional substitution.


Uddrag fra templateProcessor.bat


setlocal enableDelayedExpansion
...
set "X=^!"
set "C=^"
...