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. #21
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    non, c'est pas «ok» pour la boucle for (si les noms de fichiers comportent un caractère composant l'IFS ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    find ... | while read f; do...; done
    ou, vu que tu es en bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/bash
     
    shopt -s nullglob globstar
    for f in ./**/*.c
    do
       sed -i 's/\x0d$//' "$f"
       ./ccomment  <"$f" 1<>"$f"; #heu, ça, j'suis pas sûr !?
       sed -i 's/$/\x0d/' "$f"
    done
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  2. #22
    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
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       ./ccomment  <"$f" 1<>"$f"; #heu, ça, j'suis pas sûr !?
    Moi non plus, car techniquement, on ne lit pas le dit fichier sur 1 mais sur 0.
    Pour moi, si le tampon d'entrée est plus petit que ton fichier, celui-ci sera écrasé avant la lecture complète, mais je me trompe peut-être.
    Je conseillerais de passer par un fichier temporaire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ./ccomment  <"$f" >"$f.tmp"; mv "$f.tmp" "$f"
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        ./ccomment  <"$f" >"$f.tmp" && mv "$f.tmp" "$f"
    Dans ce cas, mv ... ne sera éxécuté que si la commande précédente se fait sans erreur.
    Cordialement.

  3. #23
    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 pour le blindage supplémentaire au sujet des noms de fichiers.

    Ensuite, pour la ligne controversée, il était 3h du mat et je ne voyais plus très clair ! Je n'ai pas trop réfléchi là-dessus, j'ai vu que ça fonctionnait sur différents HelloWorld....

    Pour le fichier temporaire, oui, j'avais prévu la seconde méthode. Ce qui m'importait à ce moment là était le contenu de la sortie.

    Merci à tous pour vos aides précieuses. Je ne sais pas si je retiendrais tout pour la prochaine fois mais j'ai appris.

    Je passe la discussion en résolu. Si toutefois vous aviez des ajouts à faire, n'hésitez pas !

  4. #24
    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
    Pour ceux que ça intéressent, avec l'option shopt -s nullglob globstar du bash, la commande "sed" peut aussi faire dans la récursivité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -i 'syntaxe' ./**/*.c
    Testé et approuvé
    $ man woman
    Il n'y a pas de page de manuel pour woman.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    nullglob est alors inutile.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #26
    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
    Bon à savoir tout ça.


    Pour le descripteur 1<>fichier en lecture-écriture simultanée, je doute. Ça reste un flux.
    Quand on lit une ligne, elle appartient déjà au passé.
    Quand on écrit, on écrase une phrase que l'on n'a pas encore lue.
    Je n'ai pas encore vu de cas qui nécessitait ce genre de canal.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  7. #27
    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
    Interressant la récursivité du sed, on doit donc pouvoir faire ça sans boucle en un seul sed qui transforme le CRLF, appelle ccomment (via la commande e du sed) et remet en format CRLF.

    Je ne peux pas tester dans l'immédiat...
    Cordialement.

  8. #28
    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
    Je devais convertir, je l'ai donc fait avec ce scipt-ci (que je comprends !) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    shopt -s nullglob globstar
    for f in ./**/*.c ./**/*.h
    do
        sed -i 's/\x0d$//' "$f"
        ./ccomment  <"$f" >"$f.tmp" && mv "$f.tmp" "$f"
        sed -i 's/$/\x0d/' "$f"
        echo "$f"
    done
    Les autres formes proposées sont encore floues.
    Vos discussions m'ont incité à retourner lire la littérature de sed.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    for f in ./**/*.{c,h}
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #30
    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
    Ou tout simplement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    shopt -s globstar
    sed -i "s/\\x0d\$//;H;\${g;s/\\(.*\\)/echo '\1' | .\\/ccomment/e;s/[^\\x0d]\\x0a/\\x0d\\x0a/g}" ./**/*.{c,h}
    Cordialement.

  11. #31
    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
    Bon je confirme aussi la récursivité pour sed avec l'option globstar de bash

    On active l'option ;
    Arborescence des fichiers ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ ls -lR ./**/*.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./f.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep1/f.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep1/sous-repA/f.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep1/sous-repB/f.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep1/sous-repC/f.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep/f.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep/sous-repA/f.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep/sous-repB/f.c
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep/sous-repC/f.c
    On vérifie le format des fichiers (sauce Windows) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ file ./**/*.c
    ./f.c:                ASCII C++ program text, with CRLF line terminators
    ./rep1/f.c:           ASCII C++ program text, with CRLF line terminators
    ./rep1/sous-repA/f.c: ASCII C++ program text, with CRLF line terminators
    ./rep1/sous-repB/f.c: ASCII C++ program text, with CRLF line terminators
    ./rep1/sous-repC/f.c: ASCII C++ program text, with CRLF line terminators
    ./rep/f.c:            ASCII C++ program text, with CRLF line terminators
    ./rep/sous-repA/f.c:  ASCII C++ program text, with CRLF line terminators
    ./rep/sous-repB/f.c:  ASCII C++ program text, with CRLF line terminators
    ./rep/sous-repC/f.c:  ASCII C++ program text, with CRLF line terminators
    La commande (avec sauvegarde) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ sed -i.bak "s#\\x0d\$##;s#.*#/bin/echo -E '&' | ccomment#e;s#\$#\\x0d#" ./**/*.c
    L'arborescence de contrôle pour la sauvegarde :
    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
    $ ls -lR ./**/*.c*
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:29 ./f.c.bak
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep1/f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:35 ./rep1/f.c.bak
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep1/sous-repA/f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:35 ./rep1/sous-repA/f.c.bak
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep1/sous-repB/f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:35 ./rep1/sous-repB/f.c.bak
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep1/sous-repC/f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:35 ./rep1/sous-repC/f.c.bak
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep/f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:35 ./rep/f.c.bak
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep/sous-repA/f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:35 ./rep/sous-repA/f.c.bak
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep/sous-repB/f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:35 ./rep/sous-repB/f.c.bak
    -rw-r--r-- 1 jp jp 440 août  22 22:39 ./rep/sous-repC/f.c
    -rw-r--r-- 1 jp jp 422 août  22 22:35 ./rep/sous-repC/f.c.bak
    Le contrôle du format :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ file ./**/*.c
    ./f.c:                ASCII C program text, with CRLF line terminators
    ./rep1/f.c:           ASCII C program text, with CRLF line terminators
    ./rep1/sous-repA/f.c: ASCII C program text, with CRLF line terminators
    ./rep1/sous-repB/f.c: ASCII C program text, with CRLF line terminators
    ./rep1/sous-repC/f.c: ASCII C program text, with CRLF line terminators
    ./rep/f.c:            ASCII C program text, with CRLF line terminators
    ./rep/sous-repA/f.c:  ASCII C program text, with CRLF line terminators
    ./rep/sous-repB/f.c:  ASCII C program text, with CRLF line terminators
    ./rep/sous-repC/f.c:  ASCII C program text, with CRLF line terminators
    On vérifie un fichier dans l'arborescence :
    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
    $ cat rep1/sous-repA/f.c
    /* 
      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 */
    Et on contrôle sa sauvegarde :
    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
    $ cat rep1/sous-repA/f.c.bak 
    /* 
      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
    Enjoy
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  12. #32
    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
    En voyant ta solution, je me dis que je me suis vraiment compliqué la vie en chargeant dabord la totalité du fichier dans sed avant le passage à ccomment

    Par contre, en faisant mes tests avec ce que j'avais sous la main (cygwin), je conseil de remettre en format dos que si c'est utile donc comme je le fais dans ma proposition (s/[^\x0d]$/\x0d/), car ayant compilé ccomment.c avec un gcc sous windows, celui-ci me rajoute lui même le caractere \x0d à la fin de chaque ligne.
    Cordialement.

  13. #33
    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
    Il y a des trucs vachement puissant qu'un développeur devrait connaître pour se simplifier la vie .... ! En tout cas, je vous ai fait réfléchir !

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

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