Voici une methode qui permet de remplacer une chaine de caractères dans un fichier texte
Ce qui suit est globalement une copie d'une reponse que j'ai faite ici : http://www.codes-sources.com/infomsg_RE ... 2.aspx?p=3
pour commencer je cree un fichier texte appelé LeVillageGaulois.txt et qui ce trouve dans c:\temp.
Voici sa structure :
Asterix
Obelix
Milou
Abraracourcix
Panoramix
Agecanonix
ceux qui connaissent la fameuse BD auront rapidement compris que ce fichier contient une erreur que l'on vas corriger
maintenant le batch puis quelques explications :
Code : Tout sélectionner
----------------------------------------------------------------------------
@ echo off
rem -----------------------------------------------
rem remplacer une chaine de caractères dans un fichier texte
rem cree par Bigfish alias Philippe E
rem le 08-08-08
rem -----------------------------------------------
set chemin=c:\temp\
rem si le fichier n'existe pas ou n'a pu etre trouve, on arrete tout
if not exist %chemin%LeVillageGaulois.txt goto fin
rem on cherche le numero de ligne et on l'ecrit dans un fichier tmp.txt
rem cette valeur est sous la forme d'une chaine: [numeros de ligne]valeur recherchee
type %chemin%LeVillageGaulois.txt | find /n /i "milou" > %chemin%tmp.txt
rem on recupere cette valeur pour la mettre dans une variable
for /f %%i in (%chemin%tmp.txt) do set numligne=%%i
rem on en profite pour verifier que quelque chose a bien ete trouve
if "%numligne%" == "" goto rientrouvee
rem on recupere le numero de ligne dans la chaine: [numeros de ligne]valeur recherchee
set numligne=%numligne:~1,1%
set /a numligne=numligne-1
rem creation d'un fichier temporaire a partir du fichier source mais sans la ligne trouvée
type %chemin%LeVillageGaulois.txt | find /v /i "milou" > %chemin%tmp.txt
rem on efface le fichier source.
del %chemin%LeVillageGaulois.txt
rem on boucle sur toute les lignes du fichier temporaire en passant chaque ligne en parametre a la subroutine (%%i)
set compteur = 1
for /f %%i in (%chemin%tmp.txt) do call :subroutine %%i
rem la boucle est terminee on efface le fichier temporaire
del %chemin%tmp.txt
echo modification terminee
pause
goto fin
:rientrouvee
del %chemin%tmp.txt
echo la ligne recherchee n'a pu etre trouvee
pause
goto fin
:subroutine
rem on recree le fichier source avec chaque ligne du fichier temporaire via le parametre %1
echo %1 >> %chemin%LeVillageGaulois.txt
set /a compteur=compteur+1
rem si compteur est = au numero de ligne qui precede la ligne a remplacer on ajoute la nouvelle ligne
if %compteur% == %numligne% echo Idefix >> %chemin%LeVillageGaulois.txt
:fin
rem @33ddI7IHd
--------------------------------------------------------------
Pourquoi : type %chemin%LeVillageGaulois.txt | find /n /i "milou" > %chemin%tmp.txt
et pas directement : find /n /i "milou" %chemin%LeVillageGaulois.txt > %chemin%tmp.txt
et bien la premiere solution renvoi :
[3]Milou
alors que la 2ieme solution renvoi :
---------- C:\TEMP\TEST.TXT
[3]Milou
la premiere solution sera evidemment plus simple a gerer vu qu'elle renvoi directement ce qui nous interesses.
comment ca marche :
la commande type liste le contenu du fichier specifier, puis le signe de redirection | (appele pipe) redirige le resultat de la commande type sur la commande find. Cette commande find va alors chercher ligne par ligne la chaîne qui nous interesses.
Ici la nuance est que la premiere solution fait une recherche ligne par ligne alors que la deuxieme solution fait une recherche sur le fichier.
les options de la commande find utilisées dans ce batch:
/V Affiche toutes les lignes ne contenant pas la chaîne spécifiée.
/N Affiche les numéros de ligne avec les lignes affichées.(les lignes qui contiennent la chaîne recherchée)
/I Ignore la casse lors de la recherche de la chaîne.
A+
33ddI7IHd