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

Linux Discussion :

Sed command pour des pathname ?


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut Sed command pour des pathname ?
    Salut tout le monde,

    voila dans un fichier file.ksh j'ai ça :
    MY_DIR=MY_DIR_value

    ensuite, je veux remplacer MY_DIR_VALUE par un nom de répertoire (/temp/moi/dir) avec sed :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    value="$PWD"
    sed -e's/MY_DIR_value/$value/g' file.ksh > file.ksh
    mais ç morche pas:
    sed : commande incohérente : s/MY_DIR_value//temp/moi/dir/g

    par contre, ca marche si value vaut une donnée sans '/'

    comment faire pour remplacer MY_DIR_value pas un pathname ?

    Fifouille

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu peux utiliser pratiquement n'importe quel caractère pour délimiter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    s#pat#str#flags
    s/pat/str/flags
    s§pat§str§flags
    s€pat€str€flags
    Et si tu veux utiliser ce caractère pour autre chose, il faut le banaliser en lui rajoutant un anti-slash devant.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    En protégeant les "/" dans les expressions du sed ...

    Par exemple, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value=`echo $PWD | sed s/\\\\\//\\\\\\\\\\\\\\\\\\\\\//g`
    mais ça finit par ne plus être lisible

    Finalement, l'utilisation d'un caractère alternatif pour la séparation des expressions rationnelles est la meilleure solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    value="$PWD"
    sed -e 's\=MY_DIR_value=$value=g' file.ksh > file.ksh
    utilise le = à la place des /. Donc s'il y a des / et pas de = dans les chemins à convertir, ça marche nickel.
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  4. #4
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    j'ai pas compris la deuxième solution, mais je l'ai essayé qd meme, ca marche pas...

  5. #5
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Il y a un backslash en trop.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    WAOUUUUHHHHH !
    ca marche !!!


    Mais bon, c'est pas que je veux pas chipoter, mais comment ça se fait que ça marche ?
    normalement, la commande sed fonctionne comme ça (d'apres le man):
    sed -e "s/testpattern/replace/g"

    Alors comment ca se fait que ca marche avec des '='

    ???


    Enfin, en tout cas, ca marche !
    Merci merci beaucoup !

  7. #7
    Membre expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Points : 3 166
    Points
    3 166
    Par défaut
    Citation Envoyé par Luc Hermitte
    Il y a un backslash en trop.
    Oui et non.

    Il est dans le man (si, si, j'ai regardé), alors je le mets.

    Ça marche avec, alors je le mets.

    Ça marche aussi sans, mais j'ai déjà deux raisons pour le mettre, alors je le mets

    En fait, ce sont les guillemets, qu'il ne fallait pas mettre (car elles altèrent l'interprétation du \). Lire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    value="$PWD"
    sed -e s\=MY_DIR_value=$value=g file.ksh > file.ksh
    La FAQ Perl est par ici
    : La fonction "Rechercher", on aurait dû la nommer "Retrouver" - essayez et vous verrez pourquoi !

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2003
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 66
    Points : 43
    Points
    43
    Par défaut
    Merci !!!!


    beaucoup merci !



    fifouille

  9. #9
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    M'est avis que c'est un effet de bord, et qu'il est éliminé par le shell avant même d'arriver à sed.
    On peut parfaitement mettre les guillemets, c'est l'antislash qui est définitivement de trop. Quand il n'y a pas de guillemets, vu que '\=' n'est pas un caractère spécial pour le shell (bash chez moi), ce dernier ignore le '\'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // :::: print-argv.cpp ::::
    #include <iostream>
    #include <iterator>
    #include <algorithm>
     
    int main (int argc, char **argv)
    {
        std::copy(argv,argv+argc,
                std::ostream_iterator<char*>(std::cout, "\n"));
        return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $> ./print-argv.exe s\=toto "s\=toto" 's\=toto' s\ toto s\\toto
    ./print-argv
    s=toto
    s\=toto
    s\=toto
    s toto
    s\toto
    Si les '\' ne mangent pas de pain, alors il faut en mettre un avant chaque caractère avec lequel le shell ne cherche pas à l'associer.

    La doc est d'ailleurs claire :
    Citation Envoyé par info sed
    The syntax of the `s' (as in substitute) command is `s/REGEXP/REPLACEMENT/FLAGS'. The `/' characters may be uniformly replaced by any other single character within any given `s' command.
    The `/' character (or whatever other character is used in its stead) can appear in the REGEXP or REPLACEMENT only if it is preceded by a `\' character.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut explication sur la commande sed

  11. #11
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Joli déterrage...
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

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

Discussions similaires

  1. Conseil pour créer un bon de commande pour des produit divers
    Par baba59360 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 05/03/2015, 18h13
  2. Réponses: 4
    Dernier message: 31/10/2007, 15h11
  3. interface graphique pour des commandes linux
    Par A7med dans le forum Applications et environnements graphiques
    Réponses: 2
    Dernier message: 24/10/2007, 16h49
  4. Commandes pour le test des ports ouverts
    Par edogawa dans le forum Sécurité
    Réponses: 1
    Dernier message: 07/05/2007, 02h15
  5. Commande pour afficher des chiffres apres la virgule
    Par manar dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/09/2004, 18h28

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