Заменить все, используя пакетный скрипт - PullRequest
0 голосов
/ 18 декабря 2018

Я пытаюсь найти "tenant_id = 1234" и заменить на "tenant_id = 649" в файле со многими вхождениями.Я нашел код ниже, но не могу заменить, когда я добавляю = / пробел в переменной.Я также пытался убежать от персонажа, но кое-как его не получилось.Пожалуйста, дайте мне знать, как выполнить это требование, используя пакетный скрипт в .bat файле.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "INTEXTFILE=test.txt"
set "OUTTEXTFILE=test_out.txt"
set "SEARCHTEXT=tenant_id ^= 1234"
set "REPLACETEXT=tenant ^= 123456"

echo %SEARCHTEXT%

echo %REPLACETEXT%

for /f "delims=" %%A in ('type "%INTEXTFILE%"') do (
    set "string=%%A"
    set "modified=!string:%SEARCHTEXT%=%REPLACETEXT%!"
    echo !modified!>>"%OUTTEXTFILE%"
)

del "%INTEXTFILE%"
rename "%OUTTEXTFILE%" "%INTEXTFILE%"
endlocal

Ответы [ 2 ]

0 голосов
/ 18 декабря 2018

Windows7 + содержит PowerShell с оператором -replace на основе RegEx,
, чтобы вы могли использовать его напрямую или вызывать из пакета как инструмент.

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "INTEXTFILE=test.txt"
set "SEARCHTEXT=tenant_id = 1234"
set "REPLACETEXT=tenant = 123456"

powershell -NoP -C "(Get-Content $ENV:INTEXTFILE) -Replace $ENV:SEARCHTEXT,$ENV:REPLACETEXT|Set-Content $ENV:INTEXTFILE"

В случае, если тексты содержат символы .*()^$[] который будет интерпретироваться как RE,
вы можете либо переключиться на метод .Replace() (требуется PSv3 +)

powershell -NoP -C "(Get-Content $ENV:INTEXTFILE).Replace($ENV:SEARCHTEXT,$ENV:REPLACETEXT)|Set-Content $ENV:INTEXTFILE"

, либо автоматически экранировать тексты с помощью [RegEx] :: Escape ()

powershell -NoP -C "(Get-Content $ENV:INTEXTFILE) -Replace [RegEx]::Escape($ENV:SEARCHTEXT),$ENV:REPLACETEXT|Set-Content $ENV:INTEXTFILE"
0 голосов
/ 18 декабря 2018

Это легко достижимая задача с использованием JREPL.BAT , написанного Дейвом Бенхамом , который представляет собой гибрид пакетного файла / JScript для выполнения замены регулярного выражения в файле с использованием JScript..

@echo off
if not exist "test.txt" goto :EOF
if not exist "%~dp0jrepl.bat" goto :EOF

call "%~dp0jrepl.bat" "(tenant_id *= *)1234" "$1649" /F "test.txt" /O -

Пакетный файл сначала проверяет, существует ли вообще изменяемый файл, и сразу же завершает работу, если это условие не выполняется, см. Куда возвращается GOTO: EOF?

Пакетный файл JREPL.BAT должен храниться в том же каталоге, что и пакетный файл с кодом выше.По этой причине пакетный файл проверяет следующее, действительно ли JREPL.BAT существует в каталоге пакетного файла, и завершает работу, если это условие не выполняется.

Значение строки поиска регулярного выражения::

  • ( ... ) ... Найти строку, на которую есть ссылка в строке замены, с $1, чтобы сохранить эту часть найденной строки без изменений, начиная с
  • tenant_id ... строка с учетом регистра tenant_id
  • * ... с 0 или более пробелами
  • = ... и знаком равенства
  • * ... и еще раз 0 или более пробелов
  • 1234 ... и символы 1234.

Строка замены ссылается на найденнуюстрока, начинающаяся с tenant_id и заканчивающаяся перед номером 1234 на $1 и заменяющая 1234 на 649.

Можно также использовать регулярное выражение \d+ вместо 1234 в строке поиска, чтобы найти любое число с одной или несколькими цифрами.

Для понимания используемых команд и как ониработать, открыть окно командной строки, выполнить там следующие команды и полностью прочитать все страницы справки, отображаемые для каждой команды.

  • call /? ... объясняет также %~dp0 ...диск и путь аргумента 0, который является путем к пакетному файлу, который всегда заканчивается обратной косой чертой.
  • echo /?
  • goto /?
  • if /?
  • jrepl.bat /?
...