Quelqu'un peut-il me dire en utilisant un fichier batch dans Windows ... comment lire à partir d'un fichier et remplacer string = bath
à partir d'un fichier contenant = bath Abath Bbath XYZbathABC
avec la chaîne hello
de sorte que le résultat ressemble à hello Ahello Bhello XYZhelloABC
Développer à partir de Andriy M , et oui, vous pouvez le faire à partir d'un fichier, même de plusieurs lignes.
@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
[~ # ~] éditer [~ # ~]
Merci David Nelson, j'ai mis à jour le script pour qu'il n'ait plus les valeurs codées en dur.
SET string=bath Abath Bbath XYZbathABC
SET modified=%string:bath=hello%
ECHO %string%
ECHO %modified%
EDIT
Vous n'avez pas vu au début que vous vouliez que le remplacement soit précédé par la lecture de la chaîne d'un fichier.
Eh bien, avec un fichier batch, vous n’avez pas beaucoup de facilité pour travailler sur des fichiers. Dans ce cas particulier, vous devez lire une ligne, effectuer le remplacement, puis sortir la ligne modifiée, puis ... Quoi alors? Si vous devez remplacer toutes les occurrences de 'bath' dans tout le fichier, vous devrez utiliser une boucle:
@ECHO OFF
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (file.txt) DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !line:bath=hello!
ENDLOCAL
)
ENDLOCAL
Vous pouvez ajouter une redirection vers un fichier:
ECHO !line:bath=hello!>>file2.txt
Ou vous pouvez appliquer la redirection au fichier de commandes. Il doit être un fichier différent.
EDIT 2
Ajout du basculement correct de l’extension retardée pour le traitement correct de certains caractères ayant une signification particulière avec la syntaxe de script de traitement par lots, comme !
, ^
et al. (Merci, jeb!)
Pour éviter les sauts de ligne vierges (donner la lisibilité dans le fichier de configuration), je combine aflat et jeb answer ( here ) en quelque chose comme ceci:
@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%
Pour éviter les problèmes liés à l'analyseur de lot (par exemple, le point d'exclamation), reportez-vous à la section Problème de recherche et de remplacement du fichier de traitement par lots .
Suite à la modification du script de aflat , des caractères spéciaux tels que des points d’exclamation seront ajoutés.
@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%
Pour éviter les sauts de ligne vierges, remplacez simplement ceci:
echo !modified! >> %OUTTEXTFILE%
avec ça:
echo.!modified! >> %OUTTEXTFILE%