web-dev-qa-db-fra.com

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

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

67
EnoshBansode

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.

90
aflat
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!)

39
Andriy M

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%
11
gonzalezea

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%
3
eichhorn

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

echo !modified! >> %OUTTEXTFILE%

avec ça:

echo.!modified! >> %OUTTEXTFILE%
0
Fernando Adrian