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 :

[Bash] Extraire commentaire d'un fichier C


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Par défaut [Bash] Extraire commentaire d'un fichier C
    Bonjour à tous !

    Je viens ici vous demander de l'aide car je sèche complètement sur un exercice que l'on me demande pour ma fac.

    J'ai un fichier C quelconque, et en tête du fichier, on trouve :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    /**
     * Ligne de commentaires qui varient selon les fichiers 
     * mais toujours selon le même schéma...
    */
    On me demande, grâce à un script bash (et seulement bash) de récupérer les commentaires entre /** et */ au début du fichier et de sortir tout ça dans un fichier dédié. On m'impose également que le script doit être appellé via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monscript < fichier_dont_je_dois_récupérer_le_commentaire.c > fichier_à_sortir
    J'ai pensé à utiliser grep pour récupérer le tout dans une variable et affiner par la suite, mais je ne vois déjà pas vraiment comment accéder à mon fichier ($0 est bien ./monscript mais évidemment, $1 ne représente rien...).

    Quelqu'un aurait-il quelque chose pour me mettre sur la piste ? J'ai pas trouvé de réponse sur le net...
    Merci de prendre le temps de me répondre.

    PS : Je peux tout à fait copier les fichiers fournis pour avoir des exemples si besoin.

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

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

    grep ce n'est déjà plus bash

    appeler tel que demander, il n'y a pas d'arguments au script, il n'y a que le flux provenant du fichier; il faut le lire avec une boucle while read (voir Comment lire/parser un fichier).

    il faut tester une "variable-drapeau" (mise sur 1 quand la ligne commence par /**, passée à 0 quand la ligne commence par */) pour afficher les lignes demandées.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 160
    Par défaut
    Je ne savais pas qu'on pouvait aller aussi loin avec le shell.

    En fait si on connait le C et le bash, les outils tels que grep, sed, etc .. sont superflus
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Bonjour,
    Et si, on peut pousser le bouchon assez loin, voici une façon de faire par exemple, mais sans expliquer comment cela fonctionne car assez simple (mais pas conventionnel) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat comment.c
    /**
     * Ligne de commentaires qui varient selon les fichiers
     * mais toujours selon le même schéma...
    */
    toto
    titi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat comment.bash
    #!/bin/bash
    f(){
            [[ $x -eq 0 ]] && x=1 && return
            [[ "${t[$l]:0:3}" = "/**" ]] && x=2
            [[ "${t[$l]:0:2}" = "*/" ]] && x=1 && echo -n "${t[$l]}"
            [[ $x -eq 2 ]] && echo -n "${t[$l]}"
            l=$((l+1))
    }
    x=0; l=0; readarray -c 1 -C f t
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ comment.bash <comment.c
    /**
     * Ligne de commentaires qui varient selon les fichiers
     * mais toujours selon le même schéma...
    */

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
     
    toujours+court(){
       [[ $2 = "/**"* ]] && x=1
       ((x)) && echo "$2"
       [[ $2 = "*/"* ]] && x=0
    }
    readarray -t -c 1 -C toujours+court
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Cela ne fonctionne pas chez moi, le $2 est vide...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut

    tu peux nous envoyer une trace, stp;
    et nous dire quelle version de bash est installée sur ton système ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Voici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat comment.c
    /**
     * Ligne de commentaires qui varient selon les fichiers
     * mais toujours selon le même schéma...
    */
    toto
    titi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ cat comment.sh
    #!/bin/bash
     
    toujours+court(){
       echo "$2"
       [[ $2 = "/**"* ]] && x=1
       ((x)) && echo "$2"
       [[ $2 = "*/"* ]] && x=0
    }
    readarray -t -c 1 -C toujours+court
    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
    $ bash -x comment.sh <comment.c
    + readarray -t -c 1 -C toujours+court
    ++ toujours+court 0
    ++ echo ''
     
    ++ [[ '' = \/\*\** ]]
    ++ (( x ))
    ++ [[ '' = \*\/* ]]
    ++ toujours+court 1
    ++ echo ''
     
    ++ [[ '' = \/\*\** ]]
    ++ (( x ))
    ++ [[ '' = \*\/* ]]
    ++ toujours+court 2
    ++ echo ''
     
    ++ [[ '' = \/\*\** ]]
    ++ (( x ))
    ++ [[ '' = \*\/* ]]
    ++ toujours+court 3
    ++ echo ''
     
    ++ [[ '' = \/\*\** ]]
    ++ (( x ))
    ++ [[ '' = \*\/* ]]
    ++ toujours+court 4
    ++ echo ''
     
    ++ [[ '' = \/\*\** ]]
    ++ (( x ))
    ++ [[ '' = \*\/* ]]
    ++ toujours+court 5
    ++ echo ''
     
    ++ [[ '' = \/\*\** ]]
    ++ (( x ))
    ++ [[ '' = \*\/* ]]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ bash --version
    GNU bash, version 4.1.10(4)-release (i686-pc-cygwin)
    Copyright (C) 2009 Free Software Foundation, Inc.
    License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
     
    This is free software; you are free to change and redistribute it.
    There is NO WARRANTY, to the extent permitted by law.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    bon
    apparemment, il y a eu un changement de comportement de readarray/mapfile entre la version 4.1 (je viens de faire un test sur GNU/linux) et les version suivantes.

    c'est indiqué dans la liste des changements :
    This document details the changes between this version, bash-4.2-beta,
    and the previous version, bash-4.2-alpha.
    [...]
    l. The mapfile builtin now supplies a third argument to the callback command:
    the line about to be assigned to the supplied array index.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Ok, ça explique...

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2013
    Messages : 2
    Par défaut
    Désolé de pas avoir donné signe de vie depuis, absorbé dans mon boulot...

    En tout cas, merci de m'avoir aidé, je suis passé par un while read, et c'est allé tout seul. Il ne restait plus qu'à séparer les lignes selon ce que l'on veux obtenir via les commandes adéquates pour obtenir les informations que l'on veut.

    Si besoin, je veux bien indiquer mon code (je l'ai pas sur moi là maintenant en fait...).

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 335
    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 335
    Par défaut
    Bah, oui, cela peut toujours servir à d'autre ne serait-ce que pour avoir un exemple de plus sur lequel s'appuyer

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/01/2009, 11h34
  2. Des commentaire dans un fichier.xml
    Par Edoxituz dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 22/01/2006, 18h44
  3. Existe il un moyen d'ajouter des commentaire dans un fichier
    Par Edoxituz dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 21/01/2006, 12h31
  4. Des commentaires dans le fichier Boot.ini
    Par Furius dans le forum Windows
    Réponses: 6
    Dernier message: 27/10/2005, 10h41
  5. Inserer un commentaire dans un fichier Ini
    Par Rustine dans le forum Langage
    Réponses: 5
    Dernier message: 19/10/2005, 18h33

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