Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/03/2011, 11h25   #1
Membre éprouvé
 
Avatar de Elijha
 
Homme Laurent Nahoum
Ingénieur développement matériel électronique
Inscription : avril 2003
Messages : 250
Détails du profil
Informations personnelles :
Nom : Homme Laurent Nahoum
Âge : 42
Localisation : France, Val d'Oise (Île de France)

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

Informations forums :
Inscription : avril 2003
Messages : 250
Points : 463
Points : 463
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 :
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 :
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 :
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
Citation:
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 :
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.
__________________
- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
- Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)
Elijha est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 31/03/2011, 11h54   #2
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Voici 2 façons de procéder.

Fichier exemple :
Code :
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 :
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 :
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 :
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


$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 31/03/2011, 12h19   #3
Membre éprouvé
 
Avatar de Elijha
 
Homme Laurent Nahoum
Ingénieur développement matériel électronique
Inscription : avril 2003
Messages : 250
Détails du profil
Informations personnelles :
Nom : Homme Laurent Nahoum
Âge : 42
Localisation : France, Val d'Oise (Île de France)

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

Informations forums :
Inscription : avril 2003
Messages : 250
Points : 463
Points : 463
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 :
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.
__________________
- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
- Travailler dur n'a jamais tué personne, mais pourquoi prendre le risque (Edgar Bergen)
Elijha est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h48.


 
 
 
 
Partenaires

Hébergement Web