Remplacer variable dans un fichier

Fermé
JEROMAX Messages postés 274 Date d'inscription jeudi 22 février 2001 Statut Membre Dernière intervention 7 octobre 2013 - 4 oct. 2013 à 13:27
 Utilisateur anonyme - 7 oct. 2013 à 20:27
Bonjour,

J'ai un petit problème. j'effectue un traitement que je récupère dans une variable, cette variable contient du texte et des caractères spéciaux comme des retours chariot. Je souhaite faire une substitution dans un fichier mais ça ne fonctionne pas.
La commande que j'utilise est
sed -i -e "s|##ROUTE##|${ROUTE}|" ${FICHIER}

La variable ${ROUTE} contient le résultat de
netstat -rn 
(avec des retours chariot donc,
echo ${ROUTE}
affiche bien ce qu'il faut).
La commande sed retourne
commande 's' inachevée

Je tente d'utiliser sed mais n'importe quelle commande peut faire l'affaire du moment que cela fonctionne... :-)
Je me dit que c'est forcément possible mais je sèche...

Merci beaucoup à ceux qui se pencheront sur le problème.



A voir également:

3 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
4 oct. 2013 à 15:40
hello
avec awk (mais on ne peut pas modifier directement le fichier)
awk -v v="${ROUTE}" '{sub("##ROUTE##", v); print}' ${FICHIER}
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
4 oct. 2013 à 16:08
Salut,

avec awk (mais on ne peut pas modifier directement le fichier)
Si si, les dernières versions de awk ont implémenté cette possibilité ;-))
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
4 oct. 2013 à 15:52
Salut,

C'est clair que les retours à la ligne mettent le bronx ;-(

Mieux vaut passer directement la commande à sed grâce au flag
e
:

$ cat brol
blablabla
##ROUTE##
blablabla

$ sed -i.bak 's|##ROUTE##|netstat -rn|e' brol

$ cat brol
blablabla
Table de routage IP du noyau
Destination Passerelle Genmask Indic MSS Fenêtre irtt Iface
0.0.0.0 192.168.10.1 0.0.0.0 UG 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 wlan0
192.168.10.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
blablabla

$

;-))
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
4 oct. 2013 à 16:12
les retours à la ligne mettent le bronx ;
ou Marseille ...
pourquoi ça, ça passe pas ?
sed -i 's|##ROUTE##|echo '"${ROUTE}"'|e' brol 
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
4 oct. 2013 à 16:31
ou Marseille ..
;-)) C'est clair que c'est plus d'actualité...

pourquoi ça, ça passe pas ?
Non ;-((

$ sed 's|##ROUTE##|echo '"${var}"'|e' brol 
sed: -e expression n°1, caractère 45: commande 's' inachevée
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
4 oct. 2013 à 16:36
J'ai mal exprimé
pourquoi est ce qu'avec echo ça ne passe pas alors qu'avec netstat, oui
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
4 oct. 2013 à 16:41
Je n'en ai pas la moindre idée ;-(
Je suppute une histoire d'interprétation des fins de lignes...
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
5 oct. 2013 à 08:50
je dirais parce que $ROUTE est résoudu par le shell, donc les \n se trouvent sur la ligne de commande du sed. Ceci fonctionne, on récupère l'environement sans passer par le shell
sed -i "s|##ROUTE##|awk 'BEGIN {print ENVIRON[\"ROUTE\"]}'|e" brol 
0
JEROMAX Messages postés 274 Date d'inscription jeudi 22 février 2001 Statut Membre Dernière intervention 7 octobre 2013 10
Modifié par JEROMAX le 7/10/2013 à 14:51
Salut tout le monde
Merci à tous de vous être penchés sur le problème :
- je ne peux pas utiliser la commande netstat directement car je vous ai donné une version très simplifiée de ce qui est réellement généré. En réalité, j'ai tout un tas de commandes derrière la variable ROUTE.
- Je n'ai malheureusement pas la dernière version de awk installée sur les machines donc je ne peux utiliser le "inplace"
- dubcek, ta commande
sed -i "s|##ROUTE##|awk 'BEGIN {print ENVIRON[\"ROUTE\"]}'|e" brol
m'intéressait beaucoup mais je n'arrive pas à la faire fonctionner, il ne récupère pas le contenu de ${ROUTE}

En mixant un peu toutes vos idées, j'ai réussi à faire fonctionner le bouzin :
 echo "$(awk -v v="${ROUTE}" '{sub("##ROUTE##", v); print}' ${FICHIER})" > ${FICHIER} 

bon je pense qu'il y a certainement (beaucoup) mieux mais c'est la seule commande qui marche...
En tout cas, merci beaucoup !


[ JEROMAX ]
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
7 oct. 2013 à 16:03
il faut exporter ROUTE
export ROUTE=$(netstat ...)
$
$ X="hello"; awk 'BEGIN {print ENVIRON["X"]}'

$ export X="hello"; awk 'BEGIN {print ENVIRON["X"]}'
hello
$
0
Utilisateur anonyme
7 oct. 2013 à 20:27
salut,

ou alors, uniquement pour awk (sans point-virgule):
X="hello" awk 'BEGIN {print ENVIRON["X"]}'
hello
0