Réécrire une ligne comportant une variable path avec sed
Fermé
sylv_brl
Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013
-
28 août 2013 à 15:54
sylv_brl Messages postés 21 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 16 septembre 2013 - 2 sept. 2013 à 14:04
sylv_brl Messages postés 21 Date d'inscription lundi 24 juin 2013 Statut Membre Dernière intervention 16 septembre 2013 - 2 sept. 2013 à 14:04
A voir également:
- Réécrire une ligne comportant une variable path avec sed
- Aller à la ligne dans une cellule excel - Guide
- Site de vente en ligne particulier - Guide
- Partager photos en ligne - Guide
- Retrouver une musique avec un extrait en ligne - Guide
- Apparaitre hors ligne instagram - Guide
2 réponses
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 417
28 août 2013 à 16:37
28 août 2013 à 16:37
Salut,
Montres-nous un exemple CONCRET AVANT => APRÈS de ce que tu veux exactement, ainsi que le contenu de ta variable.
Montres-nous un exemple CONCRET AVANT => APRÈS de ce que tu veux exactement, ainsi que le contenu de ta variable.
sylv_brl
Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013
Modifié par sylv_brl le 28/08/2013 à 18:46
Modifié par sylv_brl le 28/08/2013 à 18:46
Salut zipe31 ! Alors...
> initialement j'ai un fichier MakeFile dont les premières lignes sont les suivantes :
> or j'aimerais obtenir à la place :
Le but étant d'implémenter ce processus dans un script automatisé de compilation, BuildDeps.cmd, pour obtenir cette ligne dans MakeFile après sa génération durant l'exécution dudit script. Le script possède une variable %DEPS%, chemin de compilation, qui change donc selon les configurations et qui correspond dans mon cas à
Mes problèmes sont donc les suivants :
> sed ne doit pas interpréter certains '/'des chemins comme instructions, particulièrement le '.../naali...' dans la valeur %DEPS% interprété ici en partie comme un saut de ligne
> mais j'ai besoin d'obtenir littéralement la valeur de %DEPS% et pas le terme %DEPS%
> j'ai bien trouvé des exemples avec substitutions de chemins mais pas en réécrivant une ligne précise, c'est sûrement plus simple, mais comme je l'ai dit, je suis un peu perdu...
NB : pour l'instant le script crée un nouveau fichier via MakeFile > MakefileTemp qui remplace plus-tard MakeFile.
> initialement j'ai un fichier MakeFile dont les premières lignes sont les suivantes :
CXX = g++ CFLAGS = -Wall CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/
> or j'aimerais obtenir à la place :
CXX = g++ CFLAGS = -Wall CPPFLAGS = $(CFLAGS) -Ic:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -Lc:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/
Le but étant d'implémenter ce processus dans un script automatisé de compilation, BuildDeps.cmd, pour obtenir cette ligne dans MakeFile après sa génération durant l'exécution dudit script. Le script possède une variable %DEPS%, chemin de compilation, qui change donc selon les configurations et qui correspond dans mon cas à
C:/Users/Sylvain/naali-3dlive/deps-vs2010-x64. Le script doit donc pouvoir réécrire une ligne de MakeFile tout en interprétant %DEPS% lors de l'écriture de la ligne pour donner le résultat çi-dessus dans mon cas. On m'a donc conseiller la commande 'sed' mais je n'arrive pas à trouver la bonne syntaxe.
Mes problèmes sont donc les suivants :
> sed ne doit pas interpréter certains '/'des chemins comme instructions, particulièrement le '.../naali...' dans la valeur %DEPS% interprété ici en partie comme un saut de ligne
> mais j'ai besoin d'obtenir littéralement la valeur de %DEPS% et pas le terme %DEPS%
> j'ai bien trouvé des exemples avec substitutions de chemins mais pas en réécrivant une ligne précise, c'est sûrement plus simple, mais comme je l'ai dit, je suis un peu perdu...
NB : pour l'instant le script crée un nouveau fichier via MakeFile > MakefileTemp qui remplace plus-tard MakeFile.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 417
28 août 2013 à 19:10
28 août 2013 à 19:10
Bon chez moi ça marche, mais je suis sur un VRAI système GNU/Linux :
Je pense que ça vient en partie du fait que tu sois sur windows. De plus j'avais remarqué que sous Windows avec le "sed for windows" il faut absolument entourer l'expression avec des quotes doubles er non des quotes simples ;-\
Essaye en sortant ta variables des quotes doubles comme ceci :
Mais sans garantie ;-\
$ cat plop CXX = g++ CFLAGS = -Wall CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/ $ DEPS="C:/Users/Sylvain/naali-3dlive/deps-vs2010-x64" $ sed '3 c\CPPFLAGS = $(CFLAGS) -I'"${DEPS}"'/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L'"${DEPS}"'/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/' plop CXX = g++ CFLAGS = -Wall CPPFLAGS = $(CFLAGS) -IC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -LC:/Users/Sylvain/naali-3dlive/deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/ $
Je pense que ça vient en partie du fait que tu sois sur windows. De plus j'avais remarqué que sous Windows avec le "sed for windows" il faut absolument entourer l'expression avec des quotes doubles er non des quotes simples ;-\
Essaye en sortant ta variables des quotes doubles comme ceci :
sed "3 c\CPPFLAGS = $(CFLAGS) -I"%DEPS%"/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L"%DEPS%"/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/" Makefile
Mais sans garantie ;-\
sylv_brl
Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013
28 août 2013 à 20:01
28 août 2013 à 20:01
Merci ! C'est pas encore tout à fait ça mais c'est beaucoup mieux que mes autres résultats où je me compliquais la vie qui plus est. Donc ça donne :
C'est sûrement la bonne voie, je n'ai plus qu'à chercher pourquoi il me vire les slashs de la variable, rectifier ça et poster la solution complète au prochain post j'espères.
CXX = g++ CFLAGS = -Wall CPPFLAGS = $(CFLAGS) -Ic:UsersSylvainnaali-3dlivedeps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -Lc:UsersSylvainnaali-3dlivedeps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/
C'est sûrement la bonne voie, je n'ai plus qu'à chercher pourquoi il me vire les slashs de la variable, rectifier ça et poster la solution complète au prochain post j'espères.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 417
28 août 2013 à 20:33
28 août 2013 à 20:33
Euh... y'a un truc qui me chiffonne ;-\
Normalement les chemins sous Windows ce n'est pas avec un anti-slash ?
C:/Users/Sylvain/naali-3dlive/deps-vs2010-x64
Normalement les chemins sous Windows ce n'est pas avec un anti-slash ?
C:\Users\Sylvain\naali-3dlive\deps-vs2010-x64
sylv_brl
Messages postés
21
Date d'inscription
lundi 24 juin 2013
Statut
Membre
Dernière intervention
16 septembre 2013
Modifié par sylv_brl le 29/08/2013 à 08:57
Modifié par sylv_brl le 29/08/2013 à 08:57
Oui, en fait je me suis trompé, les anti-slashs n'apparaissant pas. %DEPS% est en fait :
C'est assez explicite quand je change de délimiteur / par # comme ceci maintenant :
J'obtiens un joli :
Je suppose que je suis donc finalement obligé de passer par une étape intermédiaire pour retourner les anti-slashs en slashs pour passer de la syntaxe du chemin windows à la syntaxe comprise par l'option include.
C:\Users\Sylvain\naali-3dlive\deps-vs2010-x64
C'est assez explicite quand je change de délimiteur / par # comme ceci maintenant :
sed '3 c#CPPFLAGS = $(CFLAGS) -I%DEPS%/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -L"%DEPS%"/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/#' Makefile > MakefileTemp
J'obtiens un joli :
-Ic:\Users\Sylvain\naali-3dlive\deps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ était inattendu.
Je suppose que je suis donc finalement obligé de passer par une étape intermédiaire pour retourner les anti-slashs en slashs pour passer de la syntaxe du chemin windows à la syntaxe comprise par l'option include.
zipe31
Messages postés
36402
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 417
29 août 2013 à 09:18
29 août 2013 à 09:18
C'est assez explicite quand je change de délimiteur / par # comme ceci maintenant :Euh... non, avec la commande "c" (change) de sed il n'y a pas de délimiteur. En fait cette commande utilise juste l'anti-slash pour signifier le retour à la ligne, mais ça c'est propre au shell Linux.
sed '3 c#CPPFLAGS
Derrière la commande "c" il n'y a besoin d'aucun artifice, sauf en cas de retour à la ligne.
$ cat plop CXX = g++ CFLAGS = -Wall CPPFLAGS = $(CFLAGS) -I/usr/local/include -L/usr/local/lib -Iinclude/ $ sed '3 cBlabla' plop CXX = g++ CFLAGS = -Wall Blabla $ sed '3 c\ Blabla\ blibli ' plop CXX = g++ CFLAGS = -Wall Blabla blibli