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 :

Remplacer // par /* */


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut Remplacer // par /* */
    Bonjour,

    J'ai des milliers de lignes de code en langage C sur des dizaines de fichiers écrits par des tiers (je ne peux aller leur demander).
    L'immense majorité des commentaires sont en // ... sur une ligne ce qui n'est pas standard dans le C que nous utilisons.
    Je souhaiterais donc les remplacer par un classique bloc de commentaires entre /* ... */

    Exemple :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    // Fonction main du programme
    int main ()
    {
        printf("Hello world!\n");  // ecrit Hello World! dans la console
        return 0;  // valeur retournee par le programme // 0 : succes
    }
    // Fin du code

    Je souhaite avoir :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* Fonction main du programme */
    int main ()
    {
        printf("Hello world!\n");  /* ecrit Hello World! dans la console */
        return 0;  /* valeur retournee par le programme // 0 : succes */
    }
    /* Fin du code */

    Remarque : les // qui suivent sur une même ligne sont ignorés (cf exemple ci-dessus)

    Un script Bash doit être faisable pour automatiser ce genre de traitement. Je ne dois pas être le premier, je suppose que cela existe déjà quelque part. Je ne voudrais pas perdre du temps à réinventer la roue surtout que je ne suis pas un pro dans ce domaine. Donc si l'un de vous a un script de ce genre, je lui en serais reconnaissant.

  2. #2
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Avec "sed" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat plop
    // Fonction main du programme
    int main ()
    {
        printf("Hello world!\n");  // ecrit Hello World! dans la console
        return 0;  // valeur retournee par le programme // 0 : succes
    }
    // Fin du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat script.sed 
    \#^//# {
    s##/*#
    s#$# */#
    }
    s#^\([^/]*\)//\(.*\)$#\1 /* \2 */#

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ sed -f script.sed plop 
    /* Fonction main du programme */
    int main ()
    {
        printf("Hello world!\n");   /*  ecrit Hello World! dans la console */
        return 0;   /*  valeur retournee par le programme // 0 : succes */
    }
    /* Fin du code */
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut
    Merci ! Je testerais cela demain.

  4. #4
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Bonjour

    L'opération peut être faite en deux temps:
    1. On remplace // par /* et */ en fin de ligne
    2. On regroupe les lignes qui se suivent dont la première finit par */ et la deuxième commence par /*


    Concrètement, sed est le bon outil:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 's@//\(.*\)@/*\1*/@;H;${g;s@\*/\n/\*@\n@g;s@\n@@p' fichiers
    Si cette commande est satisfaisante, il faut rajouter l'option -i pour que le fichier original soit modifié directement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -ni 's@//\(.*\)@/*\1*/@;H;${g;s@\*/\n/\*@\n@g;s@\n@@p' fichiers

    Exemple:
    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
    $ cat monfichier
    // Fonction main du programme 
    int main () 
    {
         printf("Hello world!\n");  // ecrit Hello World! dans la console
         return 0;  // valeur retournee par le programme // 0 : succes 
     
    //test
    //en
    //plus
     
    } 
    // Fin du code
    $ sed -n 's@//\(.*\)@/*\1*/@;H;${g;s@\*/\n/\*@\n@g;s@\n@@p}' monfichier
    /* Fonction main du programme */
    int main () 
    {
         printf("Hello world!\n");  /* ecrit Hello World! dans la console*/
         return 0;  /* valeur retournee par le programme // 0 : succes */
     
    /*test
    en
    plus*/
     
    } 
    /* Fin du code*/
    $ sed -ni 's@//\(.*\)@/*\1*/@;H;${g;s@\*/\n/\*@\n@g;s@\n@@p}' monfichier
    $ cat monfichier
    /* Fonction main du programme */
    int main () 
    {
         printf("Hello world!\n");  /* ecrit Hello World! dans la console*/
         return 0;  /* valeur retournee par le programme // 0 : succes */
     
    /*test
    en
    plus*/
     
    } 
    /* Fin du code*/
    Il ne reste qu'à espérer que des "//" ne se balladent pas au milieu du code sans être des commentaires.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Arf! Doublement grillé!
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Des fois j'suis c*n, on va faire plus simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ sed 's#^//\|//\(.*\)$#/* \1 */#' plop 
    /*  Fonction main du programme */
    int main ()
    {
        printf("Hello world!\n");  /*  ecrit Hello World! dans la console */
        return 0;  /*  valeur retournee par le programme // 0 : succes */
    }
    /*  Fin du code */
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par Flodelarab Voir le message

    Il ne reste qu'à espérer que des "//" ne se balladent pas au milieu du code sans être des commentaires.
    En fait, le point peut être le plus important est de ne surtout pas remplacer un // qui serait inclus dans un // précédent (sur la même ligne donc)

    Le premier // sur une ligne => /*
    et à la fin de cette ligne, juste avant le saut de ligne, un */

    C'est peut-être plus clair dit ainsi

  8. #8
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par _iri_ Voir le message
    En fait, le point peut être le plus important est de ne surtout pas remplacer un // qui serait inclus dans un // précédent (sur la même ligne donc)

    Le premier // sur une ligne => /*
    et à la fin de cette ligne, juste avant le saut de ligne, un */

    C'est peut-être plus clair dit ainsi
    En fait c'est bien ce que fait ma dernière syntaxe

    On cherche 2 // en début de ligne OU les 2 premiers que l'on rencontre, puis on récupère tout ce qui suit jusqu'à la fin de la ligne et on entoure le tout avec des /* ... */

    $ man woman
    Il n'y a pas de page de manuel pour woman.

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Oui mais zipe31, si la ligne commence par //, ce sont bien les deux premiers que tu renconcontres. Je ne vois pas pourquoi tu fais deux cas.

    Quand aux // en plein milieu, je pensais plus à un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    cout<<"///////Au secours ////////";
    Auquel cas, il n'y a pas de commentaires.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  10. #10
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    Bonjour,

    Euh, cout<<... c'est du c++ pas du c

    Bon, après une petite recherche sur le net:
    http://www.lrdev.com/lr/c/ccomment.html
    Celui-ci propose un petit programme en C (qui se compile très facilement avec gcc):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ gcc ccomment.c -o ccomment
    et ensuite pour l'utilisation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat te.c
    // Fonction main du programme
    int main ()
    {
        printf("Hello world!\n");  // ecrit Hello World! dans la console
        printf("//////Hello world!\n//////");  // ecrit Hello World! dans la console
        return 0;  // valeur retournee par le programme // 0 : succes
    }
    // Fin du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ ./ccomment <te.c
    /* Fonction main du programme */
    int main ()
    {
        printf("Hello world!\n");  /* ecrit Hello World! dans la console */
        printf("//////Hello world!\n//////");  /* ecrit Hello World! dans la console */
        return 0;  /* valeur retournee par le programme // 0 : succes */
    }
    /* Fin du code */
    Cordialement.

  11. #11
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Oui mais zipe31, si la ligne commence par //, ce sont bien les deux premiers que tu renconcontres. Je ne vois pas pourquoi tu fais deux cas.
    C'est clair, je m'en suis rendu compte en allant me coucher en y repensant après coup. Ça m'arrive souvent au départ en posant les conditions (en début de ligne OU en milieu) et de rester sur cette idée.

    Mais bon, hier soir apparemment, il était temps que j'aille retrouver Morphée

    Merci
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  12. #12
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    Merci pour vos contributions

    - La solution proposée par disedorgue, à savoir ccomment, ne fonctionne pas. Je suppose que c'est un problème d'encodage des fichiers (ils sont en ISO-8859-1x ). Si je crée un fichier en UTF-8 avec le même code, c'est ok. Si je fais une conversion des fichiers existants en UTF-8, le résultat reste faux.

    Code original :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* 
      Ceci est un programme de test
      pour remplacer les commentaires C++
      en commentaires C
    */
    // Fonction main du programme
    // C est aussi la fonction de test
    int main ()
    {
        printf("Hello world!\n");  // ecrit Hello World! dans la console
        return 0;  // valeur retournee par le programme // 0 : succes
    }
    // Fin du code
    Code résultant, faux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /* 
      Ceci est un programme de test
      pour remplacer les commentaires C++
      en commentaires C
    */
    */ Fonction main du programme
    */ C est aussi la fonction de test
    int main ()
    {
        printf("Hello world!\n");  /* ecrit Hello World! dans la console*/
        return 0;  /* valeur retournee par le programme // 0 : succes*/
    }
    /*Fin du code*/
    - La solution proposée par zipe31, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's#^//\|//\(.*\)$#/* \1 */#'
    me retourne le même résultat que précédemment. Problème d'encodage des fichiers originaux aussi ?

    - La solution proposée Flodelarab, à savoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -ni 's@//\(.*\)@/*\1*/@;H;${g;s@\*/\n/\*@\n@g;s@\n@@p}'
    fonctionne bien a priori.
    Cependant, le résultat obtenu est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* 
      Ceci est un programme de test
      pour remplacer les commentaires C++
      en commentaires C
    */
    /* Fonction main du programme
     C est aussi la fonction de test
    */
    int main ()
    {
        printf("Hello world!\n");  /* ecrit Hello World! dans la console*/
        return 0;  /* valeur retournee par le programme // 0 : succes*/
    }
    /*Fin du code*/
    Je souhaiterais savoir si la conversion de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // Fonction main du programme
    // C est aussi la fonction de test
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /* Fonction main du programme
     C est aussi la fonction de test
    */
    est voulue ou s'il s'agit d'un effet de bord involontaire ?
    Dans le premier cas, c'est très bien, dans le second, faudrait voir à ce qu'il n'y ait pas d'autres imprévus

    Le tout est sur un svn, je peux donc revenir en arrière le cas échéant, mais je préfère travailler proprement ...

  13. #13
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 286
    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 286
    Points : 12 742
    Points
    12 742
    Par défaut
    C'est bien voulu dans l'expression, ce n'est pas un effet de bord.
    La partie qui fais ceci est s@\*/\n/\*@\n@g
    Cordialement.

  14. #14
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    • C'est voulu. C'est le deuxième temps expliqué plus haut. Sinon zipe31, et moi avions la même solution.
    • Tes fichiers viennent probablement d'un windows. Les fins de ligne sont différentes et il y a un caractère non imprimé.
      Voilà pourquoi le bloc /* */ n'est pas regroupé avec le second bloc /* */.
      Et le second bloc /* */ provient des //, // et // qui sont regroupés car le caractère non visible a été considdéré comme un caractère normal (donc englobé dans le commentaire).

      Pour verifier cela,
    • Il serait peut-être plus sage de supprimer ce caractère superflu d'abord. Avec dos2unix monfichier (si je me souviens bien) ou alors sed -i 's/\x0d$//' monfichier
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  15. #15
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut
    Renseignements pris, ils sont bien tous d'origine Windows. Cependant, il serait intéressant de garder le CRLF (\r\n) de Windows ...

    Est-ce embêtant ?

    Par ailleurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("/////Hello world!\n//////");  // ecrit Hello World! dans la console
    est remplacé en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("/*////Hello world!\n//////");  // ecrit Hello World! dans la console*/
    Merci pour vos explications détaillées, ce type de commande est toujours un émerveillement à voir à l'oeuvre !


    Si je peux me permettre une question subsidiaire, j'ai tenté un find -exec sans succès. Pour ma culture personnelle, comment faire ?
    Plutôt que mon candide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #!/bin/bash
     
    ListFiles="$(find *.c -type f)"
    for Files in ${ListFiles}; do
    	sed -ni 's@//\(.*\)@/*\1*/@;H;${g;s@\*/\n/\*@\n@g;s@\n@@p}' $Files
    done

  16. #16
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  17. #17
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Si je puis me permettre, il vaudrait mieux remplacer s@//\(.*\)@/*\1*/@ par sed 's@//\(.*\)@/* \1 */@' pour éviter les désagréments causés par une multitude de slashs

    L'exemple en entrée (donnée par _iri_ ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "${A}
    ${B}" 
    printf("/////Hello world!\n//////");  // ecrit Hello World! dans la console
    // Fin du code
    L'exemple en sortie sans espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "${A}
    ${B}" | sed 's@//\(.*\)@/* \1 */@'
    printf("/* ///Hello world!\n//////");  // ecrit Hello World! dans la console */
    /*  Fin du code */
    L'exemple en sortie avec espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "${A}
    ${B}" | sed 's@// \(.*\)@/* \1 */@'
    printf("/////Hello world!\n//////");  /* ecrit Hello World! dans la console */
    /* Fin du code */
    @Flodelarab : D'ailleurs tu vois, avant d'en arriver là, j'ai encore recommencé avec 's#\(^// \| // \)\(.*\)#/* \2 */#'
    Je suis vraiment indécrottable

    @ _iri_ : Tous les fichiers à traiter sont dans le même répertoire ou aussi dans des sous-répertoires ?
    Parce que si dans un seul, sed peut traiter tous les fichiers à la fois : sed -i 'syntaxe' *.c
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  18. #18
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut
    sur un code original :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* 
      Ceci est un programme de test
      pour remplacer les commentaires C++
      en commentaires C
    */
    // Fonction main du programme
    // C est aussi la fonction de test
    int main ()
    {
        printf("Hello world!\n");  // ecrit Hello World! dans la console
        printf("/////Hello world!\n//////");  // ecrit Hello World! dans la console
        return 0;  // valeur retournee par le programme // 0 : succes
    }
    // Fin du code
    la version mixée Flodelarab * zipe31 fonctionne à merveille (j'ai créé plusieurs fichiers avec de petites modifications à chaque fois)

    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
    #!/bin/bash
     
    sed -ni '
     
    s/\x0d$//
     
    s#\(^// \| // \)\(.*\)#/* \2 */#
    H
    ${
            g
            s@\*/\n/\*@\n@g
            s@\n@@
     
            s@\n@\x0d\n@g
     
            p
    }
    ' $*
    @zipe31
    la commande s@//\(.*\)@/* \1 */@ ne va pas (même sortie erronée) en revanche, contrairement à votre première idée s#\(^// \| // \)\(.*\)#/* \2 */#

    @ _iri_ : Tous les fichiers à traiter sont dans le même répertoire ou aussi dans des sous-répertoires ?
    aussi dans des sous-répertoires

  19. #19
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 459
    Points
    13 459
    Par défaut
    D'abord, il faut comprendre qu'aucune des solutions n'est parfaite.

    Ensuite, existe-t-il des fichiers qui ont un commentaire en "//" sans "// " ? Pour le savoir, il suffit de taper la commande de filtre suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find . -iname "*.c" -type f -exec grep "//" {} \; | grep -v "// "
    Si elle ne retourne rien, la syntaxe avec l'espace fonctionne. Sinon, elle retourne les lignes pour lequelles un problème peut apparaitre.

    Space or not space, that is the question...


    Enfin, find fait une récursion dans les sous-dossiers que ne fait pas le caractère joker *


    PS: Personnellement, je regrette que la méthode proposée par disedorgue n'ait pas abouti.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  20. #20
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 90
    Points : 92
    Points
    92
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    PS: Personnellement, je regrette que la méthode proposée par disedorgue n'ait pas abouti.
    Mais oui, je l'avais un peu oublié celui-là

    Il fonctionne très bien pour peu que je fasse les conversions CRLF LF CRLF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    ListFiles="$(find . -iname "*.c" -type f)"
    for Files in ${ListFiles}; do
        # convert CRLF -> LF
        sed -i 's/\x0d$//' $Files
        # replace cpp comment line to c comment
        ./ccomment  <$Files 1<>$Files;
        # convert LF -> CRLF
        sed -i 's/$/\x0d/' $Files
    done
    C'est ok (avec ma petite boucle for !) ?
    Des commentaires ou suggestions ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Accents remplacés par des ? durant l'écriture
    Par mona dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/01/2006, 14h13
  2. Trouver ' et remplacer par \' dans une chaîne
    Par micatmidog dans le forum Général Python
    Réponses: 9
    Dernier message: 23/12/2005, 16h09
  3. impossible de remplacer "-" par "_"
    Par fabrice1596 dans le forum Langage
    Réponses: 2
    Dernier message: 04/11/2005, 11h31
  4. [XSLT] Remplacer par des caractères spéciaux
    Par OXyGN dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 29/07/2005, 17h30
  5. [JSTL] Mes variables ne sont pas remplacées par leur valeur
    Par thomine dans le forum Taglibs
    Réponses: 9
    Dernier message: 18/03/2005, 10h00

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