Как заменить подстроки в пакетном файле Windows - PullRequest
65 голосов
/ 11 марта 2011

Может кто-нибудь сказать мне, используя пакетный файл в Windows ... как читать из файла и заменить строку = bath из файла, содержащего = bath Abath Bbath XYZbathABC на строку hello, чтобы вывод был похож на hello Ahello Bhello XYZhelloABC

Ответы [ 6 ]

87 голосов
/ 11 марта 2011

Расширение от Андрей М , и да, вы можете сделать это из файла, даже одного с несколькими строками

@echo off
setlocal EnableExtensions EnableDelayedExpansion
set "INTEXTFILE=test.txt"
set "OUTTEXTFILE=test_out.txt"
set "SEARCHTEXT=bath"
set "REPLACETEXT=hello"

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

РЕДАКТИРОВАТЬ

Спасибо, Дэвид Нельсон, я обновил скрипт, чтобы он больше не имел жестко закодированных значений.

39 голосов
/ 11 марта 2011
SET string=bath Abath Bbath XYZbathABC
SET modified=%string:bath=hello%
ECHO %string%
ECHO %modified%

РЕДАКТИРОВАТЬ

Сначала не видел, что вы хотите, чтобы замене предшествовало чтение строки из файла.

Ну, скомандный файл, у вас не так много возможностей для работы с файлами.В этом конкретном случае вам нужно прочитать строку, выполнить замену, затем вывести измененную строку, а затем ... Что тогда?Если вам нужно заменить все вхождения 'bath' во всем файле, вам придется использовать цикл:

@ECHO OFF
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (file.txt) DO (
  SET "line=%%L"
  SETLOCAL ENABLEDELAYEDEXPANSION
  ECHO !line:bath=hello!
  ENDLOCAL
)
ENDLOCAL

Вы можете добавить перенаправление в файл:

  ECHO !line:bath=hello!>>file2.txt

Или вы можете применить перенаправление к пакетному файлу. должен быть другим файлом.

РЕДАКТИРОВАТЬ 2

Добавлено правильное переключение отложенного расширения для правильной обработки некоторых символов, которые имеют особое значение ссинтаксис пакетного сценария, например !, ^ и др.(Спасибо, Джеб !)

11 голосов
/ 27 ноября 2013

Чтобы избежать пропуска пустых строк (укажите удобочитаемость в файле conf), я комбинирую ответ aflat и jeb ( здесь ) примерно так:

@echo off
setlocal enabledelayedexpansion
set INTEXTFILE=test.txt
set OUTTEXTFILE=test_out.txt
set SEARCHTEXT=bath
set REPLACETEXT=hello
set OUTPUTLINE=

for /f "tokens=1,* delims=¶" %%A in ( '"findstr /n ^^ %INTEXTFILE%"') do (
   SET string=%%A
   for /f "delims=: tokens=1,*" %%a in ("!string!") do set "string=%%b"
   if  "!string!" == "" (
       echo.>>%OUTTEXTFILE%
   ) else (
      SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!
      echo !modified! >> %OUTTEXTFILE%
  )
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
3 голосов
/ 04 июня 2013

Чтобы избежать проблем с анализатором пакетов (например, восклицательным знаком), посмотрите на Проблема с поиском и заменой пакетного файла .

Следующая модификация скрипта aflat будет включать специальные символы, такие как восклицательные знаки.

@echo off
setlocal DisableDelayedExpansion
set INTEXTFILE=test.txt
set OUTTEXTFILE=test_out.txt
set SEARCHTEXT=bath
set REPLACETEXT=hello
set OUTPUTLINE=

for /f "tokens=1,* delims=¶" %%A in ( '"type %INTEXTFILE%"') do (
    SET string=%%A
    setlocal EnableDelayedExpansion
    SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!

    >> %OUTTEXTFILE% echo(!modified!
    endlocal
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%
0 голосов
/ 27 сентября 2016

Чтобы избежать пропуска пустых строк, просто замените это:

echo !modified! >> %OUTTEXTFILE%

на:

echo.!modified! >> %OUTTEXTFILE%
0 голосов
/ 11 марта 2011

Если у вас Ruby для Windows ,

C:\>more file
bath Abath Bbath XYZbathABC

C:\>ruby -pne "$_.gsub!(/bath/,\"hello\")" file
hello Ahello Bhello XYZhelloABC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...