Как заменить подстроки в пакетном файле windows

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

Ответ 1

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

@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 ( '"type %INTEXTFILE%"') do (
SET string=%%A
SET modified=!string:%SEARCHTEXT%=%REPLACETEXT%!

echo !modified! >> %OUTTEXTFILE%
)
del %INTEXTFILE%
rename %OUTTEXTFILE% %INTEXTFILE%

ИЗМЕНИТЬ

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

Ответ 2

SET string=bath Abath Bbath XYZbathABC
SET modified=%string:bath=hello%
ECHO %string%
ECHO %modified%

ИЗМЕНИТЬ

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

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

@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

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

echo !modified! >> %OUTTEXTFILE%

с этим:

echo.!modified! >> %OUTTEXTFILE%

Ответ 6

Это намного проще:

C:\Users\usera>set var="bath Abath Bbath XYZbathABC"
C:\Users\usera>echo %var:bath=hello%
"hello Ahello Bhello XYZhelloABC"

Ответ 7

Если у вас Ruby for Windows,

C:\>more file
bath Abath Bbath XYZbathABC

C:\>ruby -pne "$_.gsub!(/bath/,\"hello\")" file
hello Ahello Bhello XYZhelloABC