IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Remplacement multiples avec sed ?


Sujet :

Shell et commandes GNU

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut Remplacement multiples avec sed ?
    Bonjour à tous,

    je ne suis pas du tout un spécialiste du shell, mais a ce que je vois, il y a nombre de personnes sur ce forum très comptentes.
    Alors peut-être une petite idée pour résoudre mon problème :
    J'ai un fichier contenant :

    ...
    timeFmt=2
    dateFmt=3
    sql=select empno, firstnme, lastname, workdept, deptname from jeudessai.employee join jeudessai.department on workdept = deptno where deptno = '&1' order by &2
    fileType=pdf
    reqType=sql
    ifs.ifsOutFile=
    ifs.ifsOverWrtFile=true
    ...


    J'appelle mon script avec des paramètres (nombre inconnu voir aucun paramètre) et le but est de substituer le paramètre &1 par $1, &2 par $2 etc... le tout dans un nouveau fichier.

    Exemple :

    monscript A00 1
    qui me donnerait au final dans un nouveau fichier :

    ...
    timeFmt=2
    dateFmt=3
    sql=select empno, firstnme, lastname, workdept, deptname from jeudessai.employee join jeudessai.department on workdept = deptno where deptno = 'A00' order by 1
    fileType=pdf
    reqType=sql
    ifs.ifsOutFile=
    ifs.ifsOverWrtFile=true
    ...


    le &1 ou &2 etc... peuvent-être plusieurs fois dans le fichier.
    Une solution ????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ( test $# -gt 0 ) ; do
    ????????
    shift
    done

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    Oui, sed peut faire ce pourquoi il a été conçu : effectuer des modifications dans un fichier.

    Typiquement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/ancien/nouveau/' fichier
    Une petite précision, en utilisant des variables, il est préférable d'utiliser des guillemets plutôt que des apostrophes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "s/&1/$1/; s/&2/$2/" ton_fichier > ton_nouveau_fichier
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    @N_BaH

    merci pour ta réponse.
    j'aurai effectivement tendance à utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/&1/$1/g" old > new
    mais le problème, c'est que je ne connais pas le nombre de paramètres, il peut être variable.
    dois-je passer par des copies de fichier dans ma boucle à chaque fois ?
    du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    i=0
      while ( test $# -gt 0 ) ; do
        let i+=1
        sed -e "s/&${i}/$1/g" old > new
        shift
        cp new old   
      done

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 391
    Points
    19 391
    Par défaut
    oui, ça m'a l'air raisonnable; mais plutôt ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    while [ $# -gt 0 ]
     do
       ((i++))
       sed -e "s/&${i}/$1/g" old
       shift
    done > new
    cp new old
    ...
    ?
    voire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    while [ $# -gt 0 ]
     do
       ((i++))
       sed -i "s/&${i}/$1/g" old
       shift
    done
    si tu disposes de GNU sed.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    821
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Mai 2008
    Messages : 821
    Points : 1 084
    Points
    1 084
    Par défaut
    Je te remercie, ça marche pec !
    bravo

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 11
    Dernier message: 04/02/2012, 18h24
  2. remplacer des #defines avec SED
    Par Kurisu dans le forum Shell et commandes GNU
    Réponses: 11
    Dernier message: 04/09/2008, 13h16
  3. remplacer une chaine de caractères avec sed
    Par salseropom dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 15/05/2007, 14h56
  4. probleme remplacement chaine de caractere avec SED
    Par rhaamo dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 24/01/2007, 15h12
  5. Remplacement d'une IP avec sed
    Par Hikage dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 04/07/2006, 16h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo