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 :

Retrouver la taille des commandes sed dans un script


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut Retrouver la taille des commandes sed dans un script
    Bonjour,
    Mon but est d'ecrire une regle d'un script ( https://github.com/belaran/pmb celui ci ) qui est un script de controle de qualité de script bash .
    La rêgle que je veux implementer doit reperer et evaluer la taille des commandes sed du fichier script pour avertir lorsqu'elle est supérieur a 20 caractere :

    example : echo "truc" | sed -e /s/truc/machin/p' <= OK
    echo "truc" | sed 's/machin/trucunpeutroplongpourlaregle/p' <= ERREUR

    j'imagine qu'il faut le faire a l'aide de sed lui même ou de grep... mais je n'ai pas réussi a le faire, voici ce que j'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     pmb_check_sed_length() {
     
        local source_file=${1}
        local nb_max_characters=${PMB_NB_MAX_CHARACTERS_BY_SED:-20}
     
        nb_line=1
        cat "${source_file}" | \ 
        while
     	   read line
        do
           sed_length=$(echo ${line} | sed -e "s/sed[-[a-z][A-Z] ]*['\"]{1}(.*)['\"]{1}/\1/p"| wc -c)
           if [[ ${sed_length} -gt ${nb_max_characters} ]]; then
                   echo "${source_file},${nb_line},Le sed à la ligne numéro ${nb_line} est trop long: taille > ${nb_max_characters},${line}"
           fi
           nb_line=$(expr "${nb_line}" + 1)
        done
     }


    mais je n'arrive pas a extraire la partie entre parenthese du sed et rien d'autre...

    Merci d'avance pour votre aide !

  2. #2
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Bonjour,
    Voici une petite aide, mais par contre je ne pense pas que tous les parsing d'une commande sed sont là...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "sed 's/machin/trucunpeutroplongpourlaregle/p'" | grep -qo "sed[-a-zA-Z ]* ['\"].\{20,\}['\"]" && echo ERREUR || echo OK
    ERREUR
    $ echo "sed 's/machin/truc/p'" | grep -qo "sed[-a-zA-Z ]* ['\"].\{20,\}['\"]" && echo ERREUR || echo OK
    OK
    ATTENTION: ici je fais un echo ERREUR si le retour du grep est vrai, et un echo OK s'il retourne faux.
    Cordialement.

  3. #3
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Merci beaucoup pour ton aide !
    La solution est plutôt simple pourtant j'ai pas reussi tout seul , merci !
    Du coup il faudrait coupler ça avec une recuperation de chaque sed de ligne au cas ou il y en ai plusieurs par ligne , c'est ça ?

  4. #4
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    En modifiant quelque peut la regex et en n'utilisant plus le connecteur -q du grep, tu peux obtenir la liste des sed recherchés qui se trouvent sur la même ligne en un seul grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ echo "titi ; sed 's/machin/truc/p' ; tata ; sed 's/machin1/truc1unpeutroplongpourlaregle/p' ; tutu; sed 's/machin3/truc3/p' ; toto ; sed 's/machin2/truc2unpeutroplongpourlaregle/p'" | grep -o "sed[-a-zA-Z ]* ['\"][^'\"]\{20,\}['\"]"
    sed 's/machin1/truc1unpeutroplongpourlaregle/p'
    sed 's/machin2/truc2unpeutroplongpourlaregle/p'
    Reste plus qu'à mettre ça comme argument dans une boucle...
    Cordialement.

  5. #5
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Merci beaucoup !!!
    Je mets résolu.

  6. #6
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Voici une petite aide, mais par contre je ne pense pas que tous les parsing d'une commande sed sont là...
    Effectivement, on doit pouvoir trouver pas mal de contre-exemples, comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "sed 's/machin/truc/p' | commande 'un peu trop longue'" | grep -qo "sed[-a-zA-Z ]* ['\"].\{20,\}['\"]" && echo ERREUR || echo OK
    ERREUR
    Je crois que c'est un problème difficile d'arriver à bien gérer tous les cas de manière statique.
    Il faudrait probablement écrire un vrai parser...
    Bonne chance!

    Par contre, en dynamique, ça me paraît beaucoup plus simple à écrire, par exemple, en masquant, dans le PATH, /bin/sed par un script /chemin/vers/mon/sed qui examine le contenu de ses arguments avant d'appeler le vrai /bin/sed.

    Une version rudimentaire (qui ne marche qu'avec un "sed" à un argument et ne traite pas les options comme "-e"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/sh
     
    test ${#1} -ge 20 && echo ERREUR || echo OK
     
    /bin/sed "$@"
    Mais ça pose une question de spécifications. La commande "sed" suivante est-elle considérée comme longue?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    exp="s/machin/trucunpeutroplongpourlaregle/p"
    sed -e "$exp"
    À moins de pas mal d'efforts, la version statique détectera une commande courte alors que la version dynamique (comme celle proposée) détecte une commande longue et a donc l'avantage de pouvoir traiter des cas tordus qui voudraient tenter de tricher pour échapper à la règle.

    Idem pour une commande comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    truc=trucunpeutroplongpourlaregle
    sed -e "s/machin/$truc/p"
    Cela dit, déterminer la qualité d'une instruction "sed" par la longueur de la commande n'est pas forcément le meilleur critère.
    En effet, il peut exister des commandes "sed" de quelques caractères vraiment difficiles à comprendre et maîtriser...

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 280
    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 280
    Points : 12 729
    Points
    12 729
    Par défaut
    Oui, j'ai corrigé ce souci dans mon deuxième post:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "sed 's/machin/truc/p' | commande 'un peu trop longue'" | grep -qo "sed[-a-zA-Z ]* ['\"][^'\"]\{20,\}['\"]" && echo ERREUR || echo OK
    OK
    Mais, ça n'empêchera pas que cela ne couvrira pas tous les cas.
    Cordialement.

  8. #8
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Oui je suis tout a fait d'accord avec toi jack-ft ! un sed peut etre très long est pourtant simple a comprendre et à maintenir alors que d'autre trucs court peuvent etre completement "tordus" .
    C'est juste demandé dans l'exercice de GNU/Linux magazine a titre d'exemple pour travailler le bash .
    La solution de modifier le sed ne rentrerait pas dans le cadre de l'exercice en fait ...

    J'ai pensé à cette commande qui semble regler l'erreur que tu as mis en évidence , mais je ne sais pas si il ya encore des-contre exemples avec celle ci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    echo "sed 's/machin/truc/p' | commande 'un peu trop longue'" | grep -qo "sed[-a-zA-Z ]* ['\"][^'\"]\{20,\}['\"]" && echo ERREUR || echo OK
    OK

  9. #9
    Membre averti Avatar de Neolex
    Homme Profil pro
    Recherche emploi Securité informatique
    Inscrit en
    Avril 2011
    Messages
    243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Recherche emploi Securité informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 243
    Points : 333
    Points
    333
    Par défaut
    Ah je n'ai pas été assez vite ^^
    Désolé du coup je repête ce que disedorgue disait...

    Merci à vous deux en tout cas !

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

Discussions similaires

  1. [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
  2. exécuter des commandes complexes dans un script bash
    Par YuGiOhJCJ dans le forum Shell et commandes GNU
    Réponses: 10
    Dernier message: 24/10/2012, 09h15
  3. Réponses: 4
    Dernier message: 14/02/2008, 22h11
  4. Réponses: 1
    Dernier message: 14/03/2007, 15h56
  5. Taille des champs entres dans un stringGrid
    Par gilles641 dans le forum Composants VCL
    Réponses: 15
    Dernier message: 11/07/2005, 10h38

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