Réécrire une ligne comportant une variable path avec sed
sylv_brl
Messages postés
21
Date d'inscription
Statut
Membre
Dernière intervention
-
sylv_brl Messages postés 21 Date d'inscription Statut Membre Dernière intervention -
sylv_brl Messages postés 21 Date d'inscription Statut Membre Dernière intervention -
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
J'essaye donc plusieurs variantes de ça sans succès :
Le résultat dans MakefileTemp avec saut de lignes non voulus :
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
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.
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/gle 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:
- Réécrire une ligne comportant une variable path avec sed
- Partager photos en ligne - Guide
- Mètre en ligne - Guide
- Aller à la ligne dans une cellule excel - Guide
- Apparaitre hors ligne instagram - Guide
- Retrouver une musique avec un extrait en ligne - Guide
2 réponses
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.
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.
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 ;-\
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.
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.
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