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 :

Insertion de blocs texte dans un fichier (sed).


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut Insertion de blocs texte dans un fichier (sed).
    Bonjour,

    Je développe actuellement une librairie constituées de plusieurs modules (.c/.h) et je dois fournir deux fichiers lib.a et lib.h
    Dans chacuns des headers des modules j'ai des blocs délimités qui doivent être "copiés" dans le fichier lib.h.
    Code module1.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // DEBUT-H-EXPORT --------------
       Déclarations du module1
       Prototypes des fonctions du module1
    // FIN-H-EXPORT --------------
       Autres déclarations du module1
       Autres prototypes des fonctions du module1
    Code module2.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // DEBUT-H-EXPORT --------------
       Déclarations du module2
       Prototypes des fonctions du module2
    // FIN-H-EXPORT --------------
       Autres déclarations du module2
       Autres prototypes des fonctions du module2
    et dans un fichier lib.h.in
    Code lib.h.in : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      Includes pour la lib
    // H-IMPORT --------------
       Déclarations de la lib
       Prototypes des fonctions de la lib
    A ce stade, j'ai réussi à copier les différents blocs des headers à la fin du fichier lib.h
    rm lib.h
    cp lib.h.in lib.h
    sed -n '/DEBUT-H-EXPORT/,/FIN-H-EXPORT/p' *.h | grep -v '\-H\-EXPORT' | sed '/./,/^$$/!d' >> lib.h
    Note: Le grep permet de supprimer les lignes contenant "H-EXPORT" et le second sed élimine les sauts de lignes vides.

    Après quelques heures de recherche infructueuses, ce que "j'aimerai" bien, c'est de pouvoir insérer les blocs délimités des headers en lieu et place de la ligne H-IMPORT dans le fichier lib.h.in.
    Code lib.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
       Includes pour la lib
       Déclarations du module1
       Prototypes des fonctions du module1
       Déclarations du module2
       Prototypes des fonctions du module2
       Déclarations de la lib
       Prototypes des fonctions de la lib
    Merci d'avance.

  2. #2
    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
    Salut,

    Voici 2 façons de procéder.

    Fichier exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat lib.h.in                  
      Includes pour la lib          
    // H-IMPORT --------------      
       Déclarations de la lib       
       Prototypes des fonctions de la lib
    1 - Avec la fonction "c" (change)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ sed '/H-IMPORT/c\             
       Déclarations du module1\     
       Prototypes des fonctions du module1\
       Déclarations du module2\
       Prototypes des fonctions du module2' lib.h.in
      Includes pour la lib
       Déclarations du module1
       Prototypes des fonctions du module1
       Déclarations du module2
       Prototypes des fonctions du module2
       Déclarations de la lib
       Prototypes des fonctions de la lib
    2 - Avec la fonction "s" (substitution)

    Les éléments à échanger sont dans un fichier texte
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ cat toto.txt
       Déclarations du module1
       Prototypes des fonctions du module1
       Déclarations du module2
       Prototypes des fonctions du module2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ sed '/H-IMPORT/ s/.*/cat toto.txt/e' lib.h.in
      Includes pour la lib
       Déclarations du module1
       Prototypes des fonctions du module1
       Déclarations du module2
       Prototypes des fonctions du module2
       Déclarations de la lib
       Prototypes des fonctions de la lib


    $

  3. #3
    Membre émérite
    Avatar de Elijha
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Avril 2003
    Messages
    314
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Avril 2003
    Messages : 314
    Par défaut
    Bonjour et merci beaucoup

    J'ai préféré utiliser la seconde solution en passant par un fichier temporaire puisque les déclarations entres les blocs délimités peuvent changer.
    Ce qui donne:
    Code "Makefile : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    # $(HEADS) : liste de tous les headers & $@ : lib.h
    %.h:
        @rm -f $@
        @sed -n '/DEBUT-H-EXPORT/,/FIN-H-EXPORT/p' $(HEADS) | grep -v '\-H\-EXPORT' | sed '/./,/^$$/!d' > file.tmp
        @sed '/H-IMPORT/ s/.*/cat file.tmp/e' $@.in > $@
        @rm file.tmp
    Et ça marche impeccablement.

    Encore merci.

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 27/12/2009, 16h32
  2. Programme de remplacement de texte dans des fichiers
    Par Invité4 dans le forum Linux
    Réponses: 13
    Dernier message: 12/11/2006, 16h06
  3. [langage] Remplacer du texte dans un fichier
    Par Michaël dans le forum Langage
    Réponses: 9
    Dernier message: 11/03/2005, 15h19
  4. Ajout de texte dans un fichier
    Par willowII dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 24/08/2004, 19h30
  5. [langage] Ecrire un bloc de texte dans un fichier
    Par sarahbes dans le forum Langage
    Réponses: 6
    Dernier message: 10/06/2004, 11h40

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