Пакетная команда для поиска / замены текста внутри файла - PullRequest
2 голосов
/ 13 февраля 2012

У меня есть файл шаблона (скажем, myTemplate.txt), и мне нужно внести некоторые изменения, чтобы создать собственный файл (скажем, myFile.txt) из этого шаблона.

Таким образом, шаблон содержит строки типа

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

Теперь я хочу заменить это следующим образом:

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

Поэтому я ищу пакетные команды для выполнения следующих действий:

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

Как мнедостичь этого?

1 Ответ

5 голосов
/ 13 февраля 2012

Самый простой способ - изменить шаблон так, чтобы он выглядел примерно так:

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

А затем используйте цикл FOR для чтения и записи файла, когда включено отложенное расширение:

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

Обратите внимание, что гораздо быстрее использовать одно перенаправление перезаписи > для всего цикла, чем использовать перенаправление добавления >> внутри цикла.

Выше предполагается, что ни одна строка в шаблоне не начинается с ;. Если это так, вам нужно изменить опцию FOR EOL на символ, который никогда не будет начинать строку. Возможно равен - for /f "usebackq eol== delims="

Также в приведенном выше примере предполагается, что шаблон не содержит пустых строк, которые необходимо сохранить. Если есть, то вы можете изменить вышеперечисленное следующим образом (это также устраняет любую потенциальную проблему EOL)

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

Существует один последний потенциальный осложняющий вопрос - у вас могут возникнуть проблемы, если шаблон содержит литералы ! и ^. Вы можете либо избежать символов в шаблоне, либо использовать дополнительную замену.

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.

извлечение из templateProcessor.bat

setlocal enableDelayedExpansion
...
set "X=^!"
set "C=^"
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...