Comment remplacer des sous-chaînes dans un fichier de commandes Windows

Quelqu’un peut-il me dire en utilisant un fichier de commandes dans Windows … comment lire un fichier et remplacer la chaîne = bath du fichier contenant = bath Abath Bbath XYZbathABC avec une chaîne hello pour que le résultat soit comme hello Ahello Bhello XYZhelloABC

Expansion d’ Andriy M , et oui vous pouvez le faire à partir d’un fichier, même avec 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 "ssortingng=%%A" set "modified=!ssortingng:%SEARCHTEXT%=%REPLACETEXT%!" echo !modified!>>"%OUTTEXTFILE%" ) del "%INTEXTFILE%" rename "%OUTTEXTFILE%" "%INTEXTFILE%" endlocal 

MODIFIER

Merci David Nelson, j’ai mis à jour le script pour qu’il n’ait plus les valeurs codées en dur.

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

MODIFIER

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 de commandes, vous n’avez pas beaucoup de facilité à 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 alors 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 append une redirection à un fichier:

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

Ou vous pouvez appliquer la redirection au fichier de commandes. Ce doit être un fichier différent.

EDIT 2

Ajout d’un basculement correct de l’extension différée pour le traitement correct de certains caractères qui ont une signification particulière avec la syntaxe de script batch, comme ! ^ et al. (Merci, jeb !)

Pour éviter les sauts de lignes vides (donner de la lisibilité dans le fichier conf), je combine les réponses aflat et jeb ( ici ) à 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 ssortingng=%%A for /f "delims=: tokens=1,*" %%a in ("!ssortingng!") do set "ssortingng=%%b" if "!ssortingng!" == "" ( echo.>>%OUTTEXTFILE% ) else ( SET modified=!ssortingng:%SEARCHTEXT%=%REPLACETEXT%! echo !modified! >> %OUTTEXTFILE% ) ) del %INTEXTFILE% rename %OUTTEXTFILE% %INTEXTFILE% 

Pour éviter les problèmes avec l’parsingur de lots (par exemple, point d’exclamation), consultez Problème avec recherche et remplacez le fichier de commandes .

Suite à la modification du script aflat , des caractères spéciaux comme 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 ssortingng=%%A setlocal EnableDelayedExpansion SET modified=!ssortingng:%SEARCHTEXT%=%REPLACETEXT%! >> %OUTTEXTFILE% echo(!modified! endlocal ) del %INTEXTFILE% rename %OUTTEXTFILE% %INTEXTFILE% 

C’est tellement plus facile:

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

Pour éviter les sauts de ligne vides, remplacez simplement ceci:

 echo !modified! >> %OUTTEXTFILE% 

avec ça:

 echo.!modified! >> %OUTTEXTFILE% 

Si vous avez Ruby pour Windows ,

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