Chercher et remplacer

Résolu
Ka-El Messages postés 279 Statut Membre -  
Ka-El Messages postés 279 Statut Membre -
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

  1. Ka-El Messages postés 279 Statut Membre
     
    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
    0
  2. Ka-El Messages postés 279 Statut Membre
     
    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 ! :-)
    0
  3. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
     
    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.

    0
  4. Ka-El Messages postés 279 Statut Membre
     
    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 ?
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      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.
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Ka-El Messages postés 279 Statut Membre
     
    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 ?
    0
    1. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930
       
      Oui c'est possible, c'est le même principe, il faut juste rajouter un CALL avant les autres CALL.
      0
  7. Ka-El Messages postés 279 Statut Membre
     
    Ah yes ! :
    call:substitution "%%%%dossier%%%%\%%%%fichier%%%%%" arborescence

    Merci beaucoup ! :-)
    0
    1. Ka-El Messages postés 279 Statut Membre
       
      J'essaye depuis quelques jours (mais en vain...) d'adapter le script de Barnabe0057 pour que celui-ci soit opérationnel sur plusieurs fichiers.
      C'est à dire:
      set FichierTexteAremplacer=D:\dossier\*.txt

      Est-ce que quelqu'un aurait une idée ?
      0
    2. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > Ka-El Messages postés 279 Statut Membre
       
      Je te donne un indice : il faut utiliser une boucle FOR, la plus simple possible.
      0
    3. Ka-El Messages postés 279 Statut Membre > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
       
      Il me semble avoir essayer, mais peut être pas en optant pour la solution la plus simple...
      Je vais retenter demain :)
      Merci
      0
    4. barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention   4 930 > Ka-El Messages postés 279 Statut Membre
       
      for %%J in (D:\dossier\*.txt) do (
      ...
      ...
      ...
      )
      0
    5. Ka-El Messages postés 279 Statut Membre > barnabe0057 Messages postés 14329 Date d'inscription   Statut Contributeur Dernière intervention  
       
      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...
      0
  8. Ka-El Messages postés 279 Statut Membre
     
    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!")
    0
    1. Ka-El Messages postés 279 Statut Membre
       
      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 ! :-)
      @+
      0