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 :

comportement de sed dans un script sh


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 3
    Par défaut comportement de sed dans un script sh
    Bonjour et merci de passer par ce sujet.

    J'ai actuellement un problème avec sed dans un script sh que je développe.
    Lorsque j'exécute la commande dans le shell tout se passe parfaitement, la ligne recherchée est supprimée correctement, mais dès que j'essaye d'exécuter la même commande à partir de mon script j'ai l'erreur.

    voici un exemple de la commande sed que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed 's_zone "un-site.com" { type master; file "~/test/conf/db.un-site.com"; };__g' < ~/test/backup/named.conf.local.bak_20090428 > ~/test/named.conf.local
    Elle fonctionne parfaitement.

    voici maintenant une partie du code source du script pour lequel cette commande a été crée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    cp "/etc/bind/named.conf.local" "/etc/bind/backup/named.conf.local.bak_${DATE_SUPPRESSION}"
    RECHERCHE="s_zone \"${LOCAL_NOM_SITE}\" { type master; file \"/etc/bind/conf/db.${LOCAL_NOM_SITE}\"; };__g"
    PARAMS="'${RECHERCHE}' < /etc/bind/backup/named.conf.local.bak_${DATE_SUPPRESSION} > /etc/bind/named.conf.local"
    `sed "${PARAMS}"`
    Le message d'erreur est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed: -e expression n°1, caractère 1: commande inconnue: `''
    Je ne comprends pas ou se pose le problème d'autant plus que si je fais un echo de sed ${PARAMS}, la commande affichée est correcte; je peux l'exécuter "manuellement" via l'invite de commande en la copiant collant et étrangement là il n'y a aucune erreur.

    Votre aide est vraiment la bien venue, des explications aussi si possible.
    D'avance merci.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour L_Hybride,

    Tu compliques tout sans nécessité.
    Sans doute parce que tu ne connais pas encore l'option -i (pour in-situ) de sed :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #sauvegarde named.conf.local
    cp /etc/bind/named.conf.local /etc/bind/backup named.conf.local.bak_${DATE_SUPPRESSION} 
     
    #suppression d'une zone dans named.conf.local
    sed -i "\_zone ${LOCAL_NOM_SITE} { type master; file \"/etc/bind/conf/db.${LOCAL_NOM_SITE}\"_d" /etc/bind/named.conf.local
    Le premier anti-slash corespond à la définition du séparateur '_', et le paramètre 'd' pour delete.
    Lorsque sed rencontrera la ligne entre _, il la supprimera dans le fichier.
    Essaye sans l'option -i...
    Ça va mieux comme ça ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 3
    Par défaut
    Bonjour N_BaH

    En effet je connais pas toutes les options de sed ... j'ai parcouru la man et pris ce qui me paraissait utile dans mon cas, puis recherche web/tutos/forums et voila le résultat. Je me rappel plus de toutes les finesses de sed, l'école est loin et depuis c'est le tout 1er script sh que je fais (il doit y avoir 5 ans de passé depuis le dernier script que j'ai écrit)


    La commande que tu as donné ne fonctionne pas plus, enfin elle ne provoque pas d'erreurs du moins.
    Mais le pattern est incorrecte, voici en le corrigeant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed -i "\_zone \"${LOCAL_NOM_SITE}\" { type master; file \"/etc/bind/conf/db.${LOCAL_NOM_SITE}\"; };_d" /etc/bind/named.conf.local
    J'ai déjà fait des essais avec d, mais je n'ai pas réussi à le faire fonctionner, en passant à s j'ai trouvé une commande qui me satisfait et fonctionne, j'ai pas été chercher plus loin

    Petite question, je ne peux pas spécifier la cible du back-up ? ou le nom du fichier ou sed doit faire son back-up ? (la man ne réponds pas à ma question et tant que j'apprends, je suis heureux ).

    Merci pour la réponse en tous les cas.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    En fait, si (je l'ai vu il n'y a pas très longtemps). Il est possible de spécifier la cible du backup directement dans la commande 'sed -i' en utilisant l'astérisque, qui rappelle le chemin et le nom du fichier traité :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # si tu veux le sauvegarder dans ton répertoire personnel
    (
    cd /etc/bind
    sed --in-place="$HOME/*-$(date +%s)" 's/old/new/' named.conf.local
    )
    # si tu veux le laisser dans son répertoire d'origine
    sed -i"*-$(date +%s)" 's/old/new/' /etc/bind/named.conf.local
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 3
    Par défaut
    Problème résolu en partie. Grace aux conseils de N_BaH, j'ai abandonné sed s pour sed d, une petite remise en forme et tout est OK. Le script est terminée.

    Cependant je n'ai toujours pas réussi à comprendre pourquoi le sed s que j'utilise ne fonctionne pas dans le script mais bien en prompt ... cela restera un mystère (n'hésitez pas à me MP si vous avez compris ...)

    Merci encore N_BaH.

    Le sujet passe en résolu.

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

Discussions similaires

  1. Commande grep/sed dans script bash avec regex
    Par 1r2R1 dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 02/04/2014, 16h49
  2. [OS X] [Bash 3] Commande SED dans un script
    Par amazigh42 dans le forum Shell et commandes POSIX
    Réponses: 2
    Dernier message: 23/01/2014, 14h26
  3. comportement de sed diverge entre ligne de commande et script
    Par yobbas dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 08/07/2010, 19h26
  4. SED -i dans un script sh ; ca marche pas
    Par lemordore dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 23/02/2007, 14h47
  5. [langage] awk et sed dans script perl
    Par scoti dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2003, 18h26

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