Commande sed assez complexe ... ^^

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.

11 réponses

  1. Merci bien tu es trop fort :D Sinon, t'aurai pas un site qui m'expliquerait bien la commande sed?
    1. Modérateur
      Essaye ça :

      sed '/-l[^-]*\\$/{:z;N;/\\$/bz;s/-l/&zlog -l/}'
      1. 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?
        1. Modérateur
          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...
          1. Modérateur
            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. 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
              1. Modérateur
                Re-

                Essaye avec ça :

                sed  '\#^\t\t$(ARCHDIR)/.*\\$#{n;s#^\t\t\(-l\)#&zlog -l#}'
                1. 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 :)
                  1. Modérateur
                    Salut,

                    J'anticipe ton retour...

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

                    Devrait faire l'affaire ;-))
                    1. Modérateur
                      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 ;-))