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 :

[sh] Lister toute les lignes comprise entre deux caractères


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Hadock
    Homme Profil pro
    Chef de projet
    Inscrit en
    Avril 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Chef de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2015
    Messages : 52
    Par défaut [sh] Lister toute les lignes comprise entre deux caractères
    Bonjour j'ai fait un petit script pour automatiquement récupérer les commentaires que j'ai mis dans mes fichiers de code, il fonctionne très bien si j'écrit les commentaires sur une ligne mais pas vraiment si je fait du multi-ligne !
    Du coup je cherche à savoir si il est possible de récupérer ce qu'il y aurait entre deux string, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // @ début du commentaire
    // bla
    // bla
    // fin du commentaire @ //
    J'ai tenté des choses avec sed mais je n'arrive à rien de concluant, auriez vous une piste ?

    Voici mon script pour le moment :
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    sh
    #!/bin/bash
     
    # allows to find a comment in each file for a project and auto generate the documentation
    # for the moment the format is \\ @, before the function, on one line
    # example a
    # 1 // @ this function make something great (great:string)
    # 2 async function(great: string) {
    # 3 ... some code
    # example b
    # 1 // @ this function make something great (great:string)
    # 2 // @ other line of comment
    # 3 async function(great: string) {
    # 4 ... some code
     
    # remove content
    : > generated_documentation.md
     
    # search comment and stock it
    grep -ri -A1 "// @ " * > tmp.md
     
    # set style
    old_IFS=$IFS
    IFS=$'\n'
    for line in $(cat tmp.md)
    do
      # suppress last { on line function (the line after the last // @) (in example a is line 2, in example b is line 3)
      if [ "${line: -1}" = "{" ] ; then
        newLine="\`\`\` ${IFS}${line::-1}${IFS} \`\`\`"
      else
        newLine="${line}"
      fi
      # suppress bad log line
      if [ "${newLine}" = "--" ] ; then
        newLine=''
      fi
      # remove command log and replace by nothing
      newLine=${newLine//[a-z0-9]*.[a-z0-9]*.ts[:||-][' '][' '][' '][' ']/}
      # remove comment 
      newLine=${newLine//'// @ '/}
      echo "${newLine}${IFS}" >> generated_documentation.md
    done
    IFS=$old_IFS
     
    # remove temporary file and exit
    rm tmp.md
    exit

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    old_IFS=$IFS
    IFS=$'\n'
    for line in $(cat tmp.md)
    NON.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line; do :...; done <fichier
    !
    et puis l'emploi de fichier temporaire induit des ralentissements dans le traitement.
    tu peux piper la sortie de grep vers l'entrée de la commande suivante (même un while, qui la passera à read), ou utiliser une substitution de processus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line; do :..; done < <(grep ...)
    je cherche à savoir si il est possible de récupérer ce qu'il y aurait entre deux string, par exemple
    il faut assigner une variable lors de la rencontre du premier motif, et la supprimer lors de la rencontre du second; tant que la variable existe, tu traites les lignes intermédiaires.

    PS: Attention, sh n'est pas forcément [/c]bash[/c] !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    grep aurait pu aider mais le découpage en lignes casse les pieds.
    sed aurait pu aider mais la gourmandise sur une expression rationnelle est un problème.
    Il reste awk ou perl.

    Une proposition un peu hack-ish, mais logique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN{FS="// @";RS="@ //";OFS=FS;ORS=RS;} {$1="\n";} 1;' | sed '1d;$d;'
    On considère la fin de commentaire comme "séparateur de fin d'enregistrement" et le début de commentaire comme "séparateur de champ". Puis on supprime le premier champ. En sortie, on supprime, par sed, la première et la dernière ligne qui sont des "séparateurs" inadéquatement rajoutés.

    Exemple de cobaye :
    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
     
    // @ début du commentaire
    // bla
    // bla
    // fin du commentaire @ //
     
    Ceci est du code
    Car ne commençant pas par //
     
    // @ Et ceci est du commentaire
    // Ainsi que cette ligne car le commentaire multiligne n'est pas fermé
    Ainsi que celle-ci car pas fermé non plus
    Et voilà la fin. @ //
     
    Et le code continu...
    Et la commande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ awk 'BEGIN{FS="// @";RS="@ //";OFS=FS;ORS=RS;} {$1="\n";} 1;' fichier.txt | sed '1d;$d;'                        
    // @ début du commentaire
    // bla
    // bla
    // fin du commentaire @ //
    // @ Et ceci est du commentaire
    // Ainsi que cette ligne car le commentaire multiligne n'est pas fermé
    Ainsi que celle-ci car pas fermé non plus
    Et voilà la fin. @ //
    Après, si ton code contient la séquence // @ ou @ // protégée par des guillemets, la détection peut devenir rock'n'roll. Car il faudra supprimer d'abord de ton fichier toutes les chaînes de caractères du code protégées par des guillemets.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut Avec sed
    Salut,

    Fichier d'entrée (merci Flodelarab) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat fich 
    // @ début du commentaire
    // bla
    // bla
    // fin du commentaire @ //
     
    Ceci est du code
    Car ne commençant pas par //
     
    // @ Et ceci est du commentaire
    // Ainsi que cette ligne car le commentaire multiligne n'est pas fermé
    Ainsi que celle-ci car pas fermé non plus
    Et voilà la fin. @ /
    La moulinette avec sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ sed -n '\#^//#{:z;N;\#//$#!bz;p}' fich 
    // @ début du commentaire
    // bla
    // bla
    // fin du commentaire @ //
    // @ Et ceci est du commentaire
    // Ainsi que cette ligne car le commentaire multiligne n'est pas fermé
    Ainsi que celle-ci car pas fermé non plus
    Et voilà la fin. @ //

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut Avec sed en prenant en compte les commentaires sur une seule ligne
    J'avais oublié la possibilité d'un commentaire sur une seule ligne

    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
    18
    $ cat fich 
    // @ début du commentaire
    // bla
    // bla
    // fin du commentaire @ //
     
    Ceci est du code
    Car ne commençant pas par //
     
    // @ Et ceci est du commentaire
    // Ainsi que cette ligne car le commentaire multiligne n'est pas fermé
    Ainsi que celle-ci car pas fermé non plus
    Et voilà la fin. @ //
    blabla
    bla
    // commentaire sur une ligne //
    bli
    bli
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sed -n '\#^//.*//$#p;\#^//#{:z;N;\#//$#!bz;p}' fich 
    // @ début du commentaire
    // bla
    // bla
    // fin du commentaire @ //
    // @ Et ceci est du commentaire
    // Ainsi que cette ligne car le commentaire multiligne n'est pas fermé
    Ainsi que celle-ci car pas fermé non plus
    Et voilà la fin. @ //
    // commentaire sur une ligne //

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 352
    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 352
    Par défaut
    On pourrait aussi le faire avec grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ grep -Pzo '(^|\n?)(// @[^@]*@ //|//[^\n]*//)\n?' fich
    // @ début du commentaire
    // bla
    // bla
    // fin du commentaire @ //
     
    // @ Et ceci est du commentaire
    // Ainsi que cette ligne car le commentaire multiligne n'est pas fermé
    Ainsi que celle-ci car pas fermé non plus
    Et voilà la fin. @ //
     
    // commentaire sur une ligne //

  7. #7
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 352
    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 352
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    J'avais oublié la possibilité d'un commentaire sur une seule ligne
    Si on met sur la toute première ligne, un commentaire sur une ligne, celui-ci est répété 2 fois.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat fich2
    // commentaire sur une ligne //
    // commentaire sur une ligne //
    $ sed -n '\#^//.*//$#p;\#^//#{:z;N;\#//$#!bz;p}' fich2
    // commentaire sur une ligne //
    // commentaire sur une ligne //
    // commentaire sur une ligne //

Discussions similaires

  1. [XL-2007] Afficher toute les dates comprises entre deux dates
    Par om.namngum dans le forum Excel
    Réponses: 8
    Dernier message: 11/11/2017, 09h03
  2. [Gestion de fichiers] Lister les lignes identiques entre deux fichiers
    Par |Psk| dans le forum Utilitaires et Sécurités
    Réponses: 0
    Dernier message: 11/02/2015, 09h09
  3. Réponses: 5
    Dernier message: 01/12/2008, 14h20
  4. Détecter les lignes identiques entre deux matrices
    Par totovich dans le forum MATLAB
    Réponses: 5
    Dernier message: 17/04/2007, 09h42
  5. afficher les dates comprisent entre deux dates
    Par hugobob dans le forum Langage SQL
    Réponses: 2
    Dernier message: 11/10/2006, 11h53

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