Chercher et remplacer [Résolu/Fermé]

Signaler
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020
-
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020
-
Bonjour,
Je cherche un moyen de changer plusieurs mots dans un même fichier.
En shell, je pense que j'arriverais à m'en sortir en utilisant un sed bien paramétré, mais en batch je suis un peu perdu.
Bien évidemment pour corser le tout, mes mots peuvent être entourés de "%" et être situés où bon leurs semble dans le fichier.
Voici un exemple de fichier:
if '%b_tab1%' == '' goto FIN
if '%b_tab1:~0,5%' == 'SOURCE-' goto SOURCE

move %dossier%\%fichier% %dossier%\DONNEES\%b_tab1%

:SOURCE
move %rep%\%fichier% D:\SOURCE_CARTO\DONNEES\%b_tab1%


Mon but ici serait donc de faire le remplacement suivant:
b_tab1 ==> mot
dossier ==> site
rep ==> arbo
fichier ==> file

Est-ce que quelqu'un aurait une idée ?
Merci
Ka-El

7 réponses

Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

J'avance un peu... Mais pour l'instant, je parviens seulement à remplacer un mot dans mon fichier:

@echo off
setlocal enabledelayedexpansion

set "Chercher=b_tab1"
set "Remplacer=mot"

set FichierTexteAremplacer=D:\dossier\fichier.txt
set NouveauFichierTexte=D:\dossier\fichier_new.txt

for /f "tokens=1,* delims=¶" %%A in ( '"type !FichierTexteAremplacer!"') do (
SET string=%%A
SET modified=!string:%Chercher%=%Remplacer%!

echo !modified! >>%NouveauFichierTexte%
)
del !FichierTexteAremplacer!
move !NouveauFichierTexte! !FichierTexteAremplacer!
exit
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Au cours de mes recherches, je suis tombé sur cette solution:
https://www.dostips.com/forum/viewtopic.php?t=1229

Celle-ci fonctionne effectivement très bien avec l'exemple qui est donné dans le sujet.
Mais j'ai du mal à l'adapter à mon besoin.
j'ai donc mon fichier "string.txt":
b_tab1 mot 
dossier site
rep arbo
fichier file


Et mon fichier "source.txt":
if '%b_tab1%' == '' goto FIN
if '%b_tab1:~0,5%' == 'SOURCE-' goto SOURCE

move %dossier%\%fichier% %dossier%\DONNEES\%b_tab1%

:SOURCE
move %rep%\%fichier% D:\SOURCE_CARTO\DONNEES\%b_tab1%


Le code proposé:
@echo off &setlocal

:processFile
>"destin.txt" type nul
for /f "delims=: tokens=1*" %%a in ('findstr /n "^" "source.txt"') do (
set "line=%%b"
call :processLine
)
goto :eof

:processLine
if not defined line (
>>"destin.txt" echo.
goto :eof
)
for /f "usebackq tokens=1* delims= " %%a in ("string.txt") do (
call set "line=%%line:%%a=%%b%%"
)
set "line=%line:^=^^%"
set "line=%line:&=^&%"
set "line=%line:<=^<%"
set "line=%line:>=^>%"
set "line=%line:|=^|%"
>>"destin.txt" echo.%line%
goto :eof


Je comprends les grandes lignes, mais c'est au niveau de certains détails que je bloque.
Du coup, sans surprise, je ne parviens pas à atteindre le résultat espéré…
Un petit coup de main serait bienvenu ! :-)
Messages postés
13510
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
10 juin 2021
4 383
Salut,

J'ai concocté un truc vite fait mais ça devrait le faire :

@echo off
setlocal enableextensions enabledelayedexpansion

set FichierTexteAremplacer=D:\dossier\fichier.txt
set NouveauFichierTexte=D:\fichier_new.txt

for /f "skip=2 tokens=1,* delims=]" %%A in ('find /V "" /N %FichierTexteAremplacer%') do (

SET "string=%%~B"

call:substitution b_tab1 mot
call:substitution dossier site
call:substitution rep arbo
call:substitution fichier file

echo.!string! >>%NouveauFichierTexte%

)

pause
exit

:substitution
if not "!string!"=="" (set "string=!string:%1=%2!")
goto :eof


C'est plutôt simple à comprendre et à modifier.



“L'intelligence artificielle se définit comme le contraire de la bêtise naturelle.”
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Salut Barnabe57,
Merci pour ton aide toujours aussi précieuse.
Ta proposition fonctionne nickel ! :-)

Ceci dit ma problématique s'est un peu intensifiée depuis hier, car maintenant il faut que je fasse la modification sur ces valeurs:
%b_tab1% &mot
%dossier% &site
%rep% &arbo
%fichier% &file


Comme tu peux le constater, on passe d'un type de variable (%xxxxx%) à un autre (&xxxx).
j'ai tenté quelques trucs avec ton code, mais ça ne marche pas très bien.
Tu as une idée ?
Messages postés
13510
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
10 juin 2021
4 383
Voilà un update :

@echo off
setlocal enableextensions enabledelayedexpansion

set FichierTexteAremplacer=D:\dossier\fichier.txt
set NouveauFichierTexte=D:\fichier_new.txt

for /f "skip=2 tokens=1,* delims=]" %%A in ('find /V "" /N %FichierTexteAremplacer%') do (

SET "string=%%~B"

call:substitution "%%%%b_tab1%%%%" mot
call:substitution "%%%%dossier%%%%" site
call:substitution "%%%%rep%%%%" arbo
call:substitution "%%%%fichier%%%%" file

echo.!string!
echo.!string! >>%NouveauFichierTexte%

)

echo. & pause
exit

:substitution
if not "!string!"=="" (set "string=!string:%~1=&%2!")
goto :eof


Dans ton exemple au niveau du deuxième IF, la variable ne peut être remplacée car elle est découpée.

Je ne comprends pas trop la finalité de ce projet.
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Salut Barnabe,
Visiblement rien ne t'es impossible ! :-)
Ton update fonctionne nickel.
Merci encore (beaucoup) pour ton aide (je t'envoi un mp pour explication sur la finalité)

Ah dernier truc, pour le fun on va dire...
Si j'avais envie de remplacer cette partie:
%dossier%\%fichier%
Par
&arborescence

Est-ce que tu penses que ce serait possible ?
Messages postés
13510
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
10 juin 2021
4 383
Oui c'est possible, c'est le même principe, il faut juste rajouter un CALL avant les autres CALL.
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Ah yes ! :
call:substitution "%%%%dossier%%%%\%%%%fichier%%%%%" arborescence

Merci beaucoup ! :-)
Messages postés
13510
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
10 juin 2021
4 383 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Je te donne un indice : il faut utiliser une boucle FOR, la plus simple possible.
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020
>
Messages postés
13510
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
10 juin 2021

Il me semble avoir essayer, mais peut être pas en optant pour la solution la plus simple...
Je vais retenter demain :)
Merci
Messages postés
13510
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
10 juin 2021
4 383 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

for %%J in (D:\dossier\*.txt) do (
...
...
...
)
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020
>
Messages postés
13510
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
10 juin 2021

En fait, je botte surtout en touche sur la génération du résultat.
En effet, il faut que chaque fichier traité (*.txt) soit renommé en (*.txt.new par exemple) mais pour l'instant je ne parviens pas à obtenir ce résultat...
Messages postés
13510
Date d'inscription
lundi 2 mars 2009
Statut
Contributeur
Dernière intervention
10 juin 2021
4 383 >
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Je n'ai pas testé mais ça devrait donner à peu près ça :

@echo off
setlocal enableextensions enabledelayedexpansion

cd /d D:\dossier || exit /b 1

for %%E in (*.txt) do (

for /f "skip=2 tokens=1,* delims=]" %%A in ('find /V "" /N "%%~E"') do (

SET "string=%%~B"

call:substitution "%%%%b_tab1%%%%" mot
call:substitution "%%%%dossier%%%%" site
call:substitution "%%%%rep%%%%" arbo
call:substitution "%%%%fichier%%%%" file

echo.!string!
echo.!string! >>"%%~E.new"

)

del /f "%%~E"

)

echo. & pause
exit

:substitution

if not "!string!"=="" (set "string=!string:%~1=&%2!")

goto :eof
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Merci Barnabe0057, ça marche nickel ! :-)
Juste une dernière question avant de fermer le sujet.
Peux-tu stp m'expliquer ce que fait cette ligne, notamment ce qui se trouve entre les parenthèses? :
if not "!string!"=="" (set "string=!string:%~1=&%2!")
Messages postés
260
Date d'inscription
lundi 28 novembre 2011
Statut
Membre
Dernière intervention
7 août 2020

Barnabe0057, laisse tomber ma question précédente... J'ai pris une minute à analyser ton script et j'ai heureusement compris. Le contraire aurait été un peu dommage...
En tout cas, merci encore pour ton aide précieuse ! :-)
@+