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