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
Bonjour,

Mon problème est le suivant : j'ai un fichier.txt dont je veux "écraser" la 3ième ligne pour y inscrire une chaine comprenant plusieurs paths, slashs, et une variable
%DEPS%
qui est un chemin comprenant
.../naali/...
. La commande est exécutée via l'invite de commande de Visual Studio 2010 x64 sous Win7 (mais je suppose que les arcanes de sed sont mieux connues sur Linux, d'où l'emplacement de ce post).

J'essaye donc plusieurs variantes de ça sans succès :

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


Le résultat dans MakefileTemp avec saut de lignes non voulus :

CPPFLAGS = $(CFLAGS) -Ic:UsersSylvain
aali-3dlivedeps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/include/ -Iinclude/ -Lc:UsersSylvain
aali-3dlivedeps-vs2010-x64/amqp/rabbitmq-c-rabbitmq-c-v0.3.0/lib/ -Llib/


Excusez-moi pour la question qui doit sembler récurrente et déjà résolue ailleurs. J'ai bien essayer d'utiliser les solutions proposées sur ce site ou ailleurs, particulièrement en préfixant les slashs par anti-slashs, les double quotes à la place des simples, le changement de délimiteur d'instruction de sed et enfin
s/$var1/$var2/g
le seul que je n'ai pas essayer car je ne veux pas substituer selon un terme mais remplacer entièrement une ligne précise... Mais étant un vrai novice en programmation, je tourne en rond et je n'arrive pas à employer ça à mes fins.

Quelqu'un pourrait-il alors me renseigner sur la syntaxe correcte avec quelques explications si possible ? Sachant que j'aimerais bien pouvoir garder la syntaxe d'entrée de ma ligne, je veux dire par là, que l'ajout de slash/antislashs soit fait automatiquement si besoin est.
A voir également:

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
Salut,

Montres-nous un exemple CONCRET AVANT => APRÈS de ce que tu veux exactement, ainsi que le contenu de ta variable.
0
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
Salut zipe31 ! Alors...

> 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.
0
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
Bon chez moi ça marche, mais je suis sur un VRAI système GNU/Linux :

$ 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 ;-\
0
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
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 :

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.
0
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
Euh... y'a un truc qui me chiffonne ;-\

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
0
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
Oui, en fait je me suis trompé, les anti-slashs n'apparaissant pas. %DEPS% est en fait :
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.
0
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
C'est assez explicite quand je change de délimiteur / par # comme ceci maintenant :
sed '3 c#CPPFLAGS
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.

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
0