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] Comportement variable selon le script


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut [sed] Comportement variable selon le script
    Bonjour,

    J'aimerai comprendre pourquoi je n' obtiens pas le même résultat
    avec une commande SED selon qu'elle est passée directement dans un émulateur de terminal (xfce4-terminal)
    ou via certain script ?

    Voici un exemple concret :

    Prenons un fichier : touch.txt contenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    TOUCH(1)                           Commandes                          TOUCH(1)
     
    NOM
           touch - Modifier l'horodatage d'un fichier
     
    SYNOPSIS
           touch [OPTION] ... FICHIER ...
     
    DESCRIPTION
           Mettre  à jour les dates (dates et heures) d'accès et de dernière modi‐
           fication de chaque FICHIER selon la date actuelle.

    Le but recherché est d'ajouter 2 simples quotes '' au début et à la fin de chaque ligne non-vide
    (ceci pour formater ce contenu en "ligne de code" de Zim — https://www.zim-wiki.org )

    Dans le terminal :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -Ei "s/^(.+)$/''\1''/g" /tmp/touch.txt
    donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $ cat /tmp/touch.txt
    ''TOUCH(1)                           Commandes                          TOUCH(1)''
     
    ''NOM''
    ''       touch - Modifier l'horodatage d'un fichier''
     
    ''SYNOPSIS''
    ''       touch [OPTION] ... FICHIER ...''
     
    ''DESCRIPTION''
    ''       Mettre  à jour les dates (dates et heures) d'accès et de dernière modi‐''
    ''       fication de chaque FICHIER selon la date actuelle.''

    si je place le script : /tmp/script.sh
    avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #!/bin/bash
    sed -Ei "s/^(.+)$/''\1''/g" /tmp/touch.txt ;
    exit
    cela fonctionne aussi.


    Pourtant le script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/bash
    # Script: zim_manpage.sh 
    # Fonction: Formater la seclection du Manuel brut de copier/coller depuis SeeTxt
    # Notes: S'utilise avec l'argument Zim :	%t	(texte séléctionné)
    #
    rm -Rf  /tmp/zim/ ;
    mkdir /tmp/zim/ ;
    tempo='/tmp/zim/manpage.txt' ;
    echo $@ > $tempo ;
    sed -Ei "s/^(.+)$/''\1''/g" $tempo ;
    cat $tempo ;
    exit

    Note : Zim possède un mécanisme de remplacement de la sélection du contenu du fichier courant (%t)
    par la sortie du script et ça fonctionne bien,
    mais le résultat du scriopt est une unique ligne ;
    c'est pareil quand je remplace $tempo par le chemin du fichier temporaire /tmp/zim/manpage.txt :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ''TOUCH(1) Commandes TOUCH(1) NOM touch - Modifier l'horodatage d'un fichier SYNOPSIS touch [OPTION] ... FICHIER ... DESCRIPTION Mettre à jour les dates (dates et heures) d'accès et de dernière modi‐ fication de chaque FICHIER selon la date actuelle. ''


    même en échappant les simples cotes avec : \'

    Pourquoi cette différence ?

    Comment y remédier ?

    Merci

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Rajoute juste des guillemets sur ta ligne echo, donc remplace echo $@ par echo "$@", et tiens nous au courant.

  3. #3
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Salut !
    Rajoute juste des guillemets sur ta ligne echo, donc remplace echo $@ par echo "$@", et tiens nous au courant.
    Je n'y crois pas !...

    j'ai passé la moitié de l'après-midi là-dessus !

    Si je comprends bien comme le contenu de %t est multi-ligne,
    il est considéré comme une série d'arguments séparés.

    C'est ça ?

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Rien a voir, le fait de ne pas encadrer de guillemets une variable, le shell ne considère pas son contenu comme une chaîne stricte et change donc tous les retour à la ligne, les multi espace, tabulation, par un seul espace.

    D'où, la devise: toujours encadrer ces variables par des guillemets sauf si on sait pourquoi on ne le fait pas.

    PS: Il n'y a techniquement qu'un seul cas où les guillemets sont facultatif: affecter une valeur à une variable via une variable (ex: foo=$bar et foo="$bar" sont vraiment équivalents).

  5. #5
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Merci pour toutes ces explications.

    Bonne soirée.

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

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

    <Hors-Sujet>
    cela dit, en passant, tout cela est probablement inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    conv2zim()
    {
        test -n "$1" || return 1
        test -d /tmp/zim || mkdir /tmp/zim
        man "$1" | sed -Ei "s/^(.+)$/''\1''/g"  >"/tmp/zim/man_$1.txt"
    }
    je le mets sous forme de fonction, mais son contenu (à part le return qu'il faut substituer par un exit) peut constituer un script.
    /tmp/ n'est pas persistent d'un redémarrage à l'autre. est-il vraiment utile de supprimer les répertoires qui tu y crées pour cette tâche à chaque exécution ?
    </Hors-Sujet>
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,
    ....je le mets sous forme de fonction,...
    Bonjour,

    Effectivement, c'est une autre manière de voir les choses ...

    ... On ne perd pas son temps sur ce forum !



    Merci
    @+

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Une autre version de sed:
    et sinon une version sans sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    man "$1" | while read ; do [[ "''$REPLY''" = "''''" ]] && echo "" || echo "''$REPLY''" ; done >"/tmp/zim/man_$1.txt"

  9. #9
    Membre averti
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2016
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Janvier 2016
    Messages : 12
    Par défaut
    @disedorgue

    ... Là il va falloir que je RTFM sérieusement ;-)

    Merci !

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    une version sans sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    man "$1" | while read ; do [[ "''$REPLY''" = "''''" ]] && echo "" || echo "''$REPLY''" ; done >"/tmp/zim/man_$1.txt"
    Euh... si je puis me permettre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    man "$1" | while read ; do test -z "$REPLY" && echo "" || echo "''$REPLY''" ; done >"/tmp/zim/man_$1.txt"
    ou, pour ceux qui aiment bien les crochets (ce qui semble être ton cas ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    man "$1" | while read ; do [ -z "$REPLY" ] && echo "" || echo "''$REPLY''" ; done >"/tmp/zim/man_$1.txt"

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    , il est vrai que j'aurai pu simplifier, mais à la base, j'avais oublié de faire un check sur la ligne vide, j'ai donc gardé la chaîne que j'affichais pour faire le check, mais je reconnais que c'est une (ho|e)rreur

    Par contre, j'ai bien une préférence mais pour les doubles crochets qui permettent plus de choix

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    j'apprécie énormément ces fonctionnalités avancées, mais si je ne les mets pas en œuvre, j'utilise un simple test (la contrainte de la mise en guillemets ne me gêne pas).
    ce sont en plus pour moi des repères visuels, je préfère ne pas les noyer dans un code plus génér-al/ique(?).
    c'est un peu comme appeler if then else fi quand tu n'as qu'une commande à passer à la suite d'un test.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Comportement variable selon les navigateurs
    Par F@bien.fd dans le forum AJAX
    Réponses: 4
    Dernier message: 27/11/2016, 10h04
  2. Passer une variable C à un script en Javascript
    Par aquouel dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 21/09/2005, 17h41
  3. Gestion de Variables dans un script
    Par John Lee dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 25/03/2005, 14h17
  4. [langage] variable selon la ligne de commande
    Par rodolphedj dans le forum Langage
    Réponses: 3
    Dernier message: 13/12/2004, 13h21
  5. [langage] Variable %ENV inter script
    Par MSP dans le forum Langage
    Réponses: 6
    Dernier message: 04/08/2003, 10h08

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