Commande sed assez complexe ... ^^

Fermé
tchou93270 - 21 avril 2010 à 17:43
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 22 avril 2010 à 13:35
Bonjour,

Donc j'expose mon problème. Je cherche en ce moment une commande sed qui permettrait d'insérer "-lzlog" juste avant le premier mot qui commencerait par -l, par contre cet autre mot doit obligatoiremeent être après un $(ARCHDIR)/ *.

Par exemple pour le fichier:

$(ARCHDIR)/zBrowser : ALL_NEEDED_LIBS $(ARCHDIR)/zBrowser.o $(ARCHDIR)/PRB_windows.o $(ARCHDIR)/zBrowser_linker.o $(ARCHDIR)/$(BANNER_O_FILE)
$(CXX) $(LIB_PATH) $(VCD_L_PTH) $(ARCHDIR)/zBrowser.o $(ARCHDIR)/PRB_windows.o $(ARCHDIR)/zBrowser_linker.o $(ARCHDIR)/$(BANNER_O_FILE) \
-lClocks -lBooleanLogic

la commande SED retournerait :

$(ARCHDIR)/zBrowser : ALL_NEEDED_LIBS $(ARCHDIR)/zBrowser.o $(ARCHDIR)/PRB_windows.o $(ARCHDIR)/zBrowser_linker.o $(ARCHDIR)/$(BANNER_O_FILE)
$(CXX) $(LIB_PATH) $(VCD_L_PTH) $(ARCHDIR)/zBrowser.o $(ARCHDIR)/PRB_windows.o $(ARCHDIR)/zBrowser_linker.o $(ARCHDIR)/$(BANNER_O_FILE) \
-lzlog -lClocks -lBooleanLogic

Je suis bloqué depuis un certain temps dessus... aidez moi please ;)
Merci d'avance.

A voir également:

11 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
Modifié par jipicy le 22/04/2010 à 11:15
Ok.

Essaie avec celle là alors :

sed  '\#^\t\t$(ARCHDIR)/.*\\$#{n;s#\(-l\)#&zlog -l#}'


Explications :

sed  ' 

\#^\t\t$(ARCHDIR)/.*\\$# 

Motif de recherche. 
\# On définit un dièse comme nouveau délimiteur (normalement le slash par défaut) pour ne pas interférer avec les slashs des chemins. 
Puis on cherche une ligne commençant (^) par 2 tabulations (\t\t) suivies par "$(ARCHDIR)" et n'importe quelle suite de caractères -.*) et se terminant ($=fin de ligne) par un backslash (\\$). Il faut protéger le backslash pour qu'il soit interprété comme tel. 


{ 
Début d'un regroupement de commandes. tout ce qui trouve entre ses accolades, sera appliqué si le motif est trouvé. 


n; 
Si le motif est trouvé on passe à la ligne suivant qui est chargée dans l'espace de travail. La ligne contenant le motif quant à elle est supprimée (du traitement) 


s#\(-l\)#&zlog -l# 
Si la ligne contient un "-l" il sera remplacé par lui même (&) suivi de "zlog -l". Comme on ne précise pas le flag "g" (global), la substitution ne s'appliquera qu'au 1er motif trouvé. 
On pourrait aussi l'écrire comme ça : 

s#[ ]*\(-l\)#&zlog -l# 

en précisant que le "-l" peut être précédé d'aucun, d'un ou plusieurs espace(s), pour se prémunir au cas ou... 


}' 
Fin du regroupement de commande.


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

GNU/Linux : Gnu/Linux is Not Ubuntu !
1
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
21 avril 2010 à 17:54
Salut,

On peut avoir une copie exacte de l'exemple (entre balise < code> < /code> (sans les espaces)) pour avoir les limites exactes de tes lignes s'il te plaît ?

Ou mieux encore un exemple en fichier joint sur Cijoint ;-))
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
21 avril 2010 à 18:22
Salut,

J'anticipe ton retour...

sed 's#$(ARCHDIR)/[^ ]* -l#&zlog -l#'

Devrait faire l'affaire ;-))
0
Salut,

T'as commande n'a pas fonctionné, voici mon fichier:
http://www.cijoint.fr/cjlink.php?file=cj201004/cij7O61eXl.txt

En fait je voudrais exactement qu'il soit avant le premier -l de $(ARCHDIR)/zConfig

...
$(ARCHDIR)/zConfig : ALL_NEEDED_LIBS $(OBJS) $(ARCHDIR)/$(BANNER_O_FILE)
@echo "";
@echo "###############################";
@echo "## link zConfig ##";
@echo "###############################";
rm -f zConfig
$(CXX) $(CXXFLAGS) $(LIB_PATH) -o $(ARCHDIR)/zConfig $(OBJS) \
$(ARCHDIR)/$(BANNER_O_FILE) \
-lzlog -lSerDes ....

.Merci c'est sympas :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
22 avril 2010 à 09:45
Re-

Essaye avec ça :

sed  '\#^\t\t$(ARCHDIR)/.*\\$#{n;s#^\t\t\(-l\)#&zlog -l#}'
0
Merci c'est cool :) , ca marche pour cet exemple, par contre pourais tu me detailler ta commande?
Parce que ca marche pour un Makefile , mais pas pour tous, en fait ce que je voudrais c'est qu'il soit avant le premier -l de chaque $(ARCHDIR)/<n'importe quel nom>

par exemple pour ce fichier:
http://www.cijoint.fr/cjlink.php?file=cj201004/cijc5AIdB2.txt

t'as commande ne marche pas , en effet, il ne m'insere pas le -lzlog avant le -lDriverEnv :

$(ARCHDIR)/zDveTools : ALL_NEEDED_LIBS $(OBJS) $(ARCHDIR)/$(BANNER_O_FILE) # $(SWDB_DIR)/ZebuDB/libZebuDB.$(DBLIBTYPE)
@echo "";
@echo "###############################";
@echo "## link zDveTools ##";
@echo "###############################";
rm -f $(ARCHDIR)/zDveTools
$(PURIFY) $(CXX) $(LIB_PATH) -o $(ARCHDIR)/zDveTools $(OBJS) \
$(ARCHDIR)/$(BANNER_O_FILE) \
-lDriverEnv
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
22 avril 2010 à 11:21
Fais un copier/coller (entre les balises < code>< /code>, le pictogramme <> après le gras (B), l'italique (I) et le soulignement (S) dans la rédaction d'un message) de ceux qui marchent pas, qu'on voit où ça merdoie et essayer de faire une commande générique...
0
En fait j'ai remarqué que c'est pas toujours après une ligne commencant par $(ARCHDIR) que je dois insérer le mot. Ce qui serait mieu je pense se serait d'insérer -lzlog avant toutes les succéssions (1 ou pluiseur) de -l dans le fichier.

Par exemple;
.....
blablabla -lzlog -la -lb -lc (cas succession)
....
blablabla -lzlog -ld (cas 1)


je sais pas si cela est possible avec une commande sed?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
22 avril 2010 à 11:51
Essaye ça :

sed '/-l[^-]*\\$/{:z;N;/\\$/bz;s/-l/&zlog -l/}'
0
Merci bien tu es trop fort :D Sinon, t'aurai pas un site qui m'expliquerait bien la commande sed?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
22 avril 2010 à 13:35
Dans la FQ : SED ;-))
0