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 :

Sed passage de variable = :command garbled


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 56
    Par défaut Sed passage de variable = :command garbled
    Bonjour à tous,

    Depuis ce matin j'essaye sans grand succès toutes les combinaisons de délimiteurs/quotes qui me passent par la tête mais rien n'y fait.

    OS: Solaris 5.10
    Shell: Ksh
    -> sed posix

    Je veux supprimer les lignes commençant par la valeur d'une variable, je cherche donc à faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cat monfichier.txt | sed '/^'"$mavariable"'/d' > monresultat.txt
    J'ai essayé sans grand succès les syntaxes suivantes:
    <- echoué sans doute car mavariable comprend un '/'

    donc j'ai tenté <- unrecognized command

    en parcourant divers forums j'ai par la suite tenté des combinaisons de quotes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed '/^'""$mavariable""'/d' -> command garbled
    sed "#^"$mavariable"#/d" -> unrecognized command
    and so on..

    Comme je commence franchement à tourner en rond, donc je me tourne vers vous, merci d'avance de vos suggestions et de votre aide ;-)


  2. #2
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Si ta variable contient un "/" , essaye la commande suivante pour le protéger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VARIABLE=${VARIABLE/\//\/}
    Normalement la commande sed doit passer sans problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed "/^$VARIABLE/d" titi.txt

  3. #3
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 56
    Par défaut
    Il doit y avoir un problème dans ta substitution, parce que j'ai rencontré le message "Bad substitution" en essayant ta solution.

    Néanmoins merci de ton aide

  4. #4
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Voici le script de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/ksh
    VARIABLE="to/to"
    echo "VARIABLE avant substitution=[$VARIABLE]"
    VARIABLE=${VARIABLE/\//\/}
    echo "VARIABLE apres substitution=[$VARIABLE]"
    echo "========contenu du fichier==========="
    cat titi.txt
    echo "======exec sed============="
    sed "/^$VARIABLE/d" titi.txt
    echo "==========================="
    Voici le fichier de test:
    et voici la sortie du script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    VARIABLE avant substitution=[to/to]
    VARIABLE apres substitution=[to\/to]
    ========contenu du fichier===========
    to/to
    tutu
    tata
    ======exec sed=============
    tutu
    tata
    ===========================

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    Si ta variable contient des slashs, il faut les protéger avec des antislashs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    export var='/taa/ga/da/'
    echo $var | sed  -e 's/\//\\\//g'
    \/taa\/ga\/da\/
    Içi, chaque slash est protégé par un anti slash.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    export var='\/taa\/ga\/da\/'
    echo -e '/taa/ga/da/tsoin/tsoin\ntsoin\npiupiu\ntoto\npffiu\n\noups\n' | sed -e "/^$var/d"
    tsoin
    piupiu
    toto
    pffiu
     
    oups
    Comme tu peux voir, le sed a bien supprimé la première ligne qui commençait par /taa/ga/da/

    édit: oups, j'aurais du rafraichir l'onglet !

  6. #6
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,


    Citation Envoyé par madmaxou
    J'ai essayé sans grand succès les syntaxes suivantes:
    <- echoué sans doute car mavariable comprend un '/'
    Essaye plutot ceci :
    Il suffit de remplacer le délimiteur de sed lorsqu'il y a des slashes.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  7. #7
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    C'est en Linuxant qu'on devient .... geek
    et en lisant les docs !!!! Autant pour moi. Je connaissais pas.

  8. #8
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Citation Envoyé par noooop
    Autant pour moi. Je connaissais pas.
    J'ai mis un moment avant de le découvrir.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  9. #9
    Membre confirmé
    Inscrit en
    Février 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 56
    Par défaut
    Oui j'avais déjà essayé différents délimiteurs, finalement j'ai trouvé une solution qui convient tout à fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '%^'"$mavariable"'%d' monfichier.txt
    et ça roule

    Cela m'évite de devoir initialiser une deuxième variable (vu que je ne dois pas altérer $mavariable en question ).

    Merci encore

  10. #10
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Citation Envoyé par Winnt Voir le message
    Il suffit de remplacer le délimiteur de sed lorsqu'il y a des slashes.
    C'est une commande invalide sur la plupart des sed (je ne savais même pas qu'un sed l'autorisait), ce qui est normal puisque % n'est pas une commande. Pour utiliser le sélecteur de lignes, il faut utiliser / (ou alors \c pour utiliser n'importe quel autre caractère c).

  11. #11
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Citation Envoyé par LLB
    C'est commande est invalide sur la plupart des sed
    Ce qui est bien dommage car cela simplifierai grandement le travail.

    @madmaxou : Le délimiteur peut aussi être # ou § selon les besoins.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  12. #12
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    je l'ai testé sur HP-UX ca marche

  13. #13
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Citation Envoyé par Winnt Voir le message
    Ce qui est bien dommage car cela simplifierai grandement le travail.

    @madmaxou : Le délimiteur peut aussi être # ou § selon les besoins.
    Ce n'est pas dommage, c'est une question de syntaxe et ça ne change qu'un seul caractère. Au lieu d'écrire %pattern%commande, on écrit \%pattern%commande. Quand au #, c'est normalement le symbôle pour les commentaires. Je ne comprends pas ce que fait votre sed, mais ce n'est pas posix (en revanche \# est accepté).

    L'avantage de cette syntaxe est que l'on peut utiliser n'importe quel caractère (y compris l'espace ou les caractères utilisés pour d'autres commandes).

  14. #14
    Rédacteur/Modérateur
    Avatar de Winnt
    Homme Profil pro
    budget et contrôle de gestion
    Inscrit en
    Décembre 2006
    Messages
    1 978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France

    Informations professionnelles :
    Activité : budget et contrôle de gestion
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 978
    Par défaut
    Salut,

    Ce commentaire rend beaucoup clair ton précédent post. Merci à toi.

    Citation Envoyé par LLB
    Ce n'est pas dommage, c'est une question de syntaxe et ça ne change qu'un seul caractère. Au lieu d'écrire %pattern%commande, on écrit \%pattern%commande. Quand au #, c'est normalement le symbôle pour les commentaires. Je ne comprends pas ce que fait votre sed, mais ce n'est pas posix (en revanche \# est accepté).

    L'avantage de cette syntaxe est que l'on peut utiliser n'importe quel caractère (y compris l'espace ou les caractères utilisés pour d'autres commandes).
    Intéressant. Je testerai et si ça passe je garderai cette syntaxe qui a l'avantage d'être portable.
    Winnt
    Merci de lire les règles du forum LaTeX et Qu'est ce qu'un ECM ?.
    N'hésitez pas à parcourir la FAQ la réponse y est peut-être déjà.
    Pensez au bouton si votre problème est résolu.


    C'est en Linuxant qu'on devient .... geek
    Et c'est en LateXant qu'on devient flemmard
    Mon blog tout neuf.
    Articles : présentation de la distribution Gentoo, Les index sous LaTeX et leur personnalisation.

  15. #15
    Membre expérimenté
    Profil pro
    Architecte de système d'information
    Inscrit en
    Mai 2007
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 72
    Localisation : France

    Informations professionnelles :
    Activité : Architecte de système d'information
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2007
    Messages : 248
    Par défaut
    Citation Envoyé par LLB Voir le message
    L'avantage de cette syntaxe est que l'on peut utiliser n'importe quel caractère (y compris l'espace ou les caractères utilisés pour d'autres commandes).
    J'ai testé l'espace et ça ne passe pas ????

  16. #16
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo -e 'foo\nbar' | sed -n '\ oo p'
    foo
    Si ça ne passe pas, c'est que ton sed n'est pas posix (et ce n'est pas bon signe). Si tu utilises sed régulièrement, je conseille le GNU sed.

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

Discussions similaires

  1. [10gR2] Exécution en ligne de commande et passage de variable
    Par leanima dans le forum Sql*Plus
    Réponses: 1
    Dernier message: 18/06/2014, 20h15
  2. passage de variable en ligne de commande
    Par PadawanInPerl dans le forum Langage
    Réponses: 15
    Dernier message: 20/01/2014, 13h51
  3. Réponses: 3
    Dernier message: 15/10/2009, 16h28
  4. Passage de variable à SED
    Par rollmol dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 12/02/2008, 12h40
  5. [langage] Passage de variables...
    Par martijan dans le forum Langage
    Réponses: 8
    Dernier message: 30/07/2003, 09h48

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