[debutant] Remplacer une chaine par la valeur d'une variable

2006-12-09 Par sujet gegetel
Bonjour,
Dans un fichier texte quelconque, il est possible avec sed de remplacer
une chaîne de caractères par une autre, voire une expression rationnelle
par une chaîne de caractères. Par exemple :
sed -i 's/\/mnt.*\/sauv/\/mnt\/removable-3\/sauv/' fichier
remplacera dans fichier l'unique chaîne de caractères «
/mnt/chemin_quelconque/sauv » par « /mnt/removable-3/sauv ».
Mais comment mettre dans la partie droite une chaîne récupérée avec grep
et awk dans un autre fichier et contenue dans une variable ? J'ai fait
des essais avec toutes sortes de parenthèses et d'apostrophes à partir de :
sed -i 's/\/mnt.*\/sauv/$path\/sauv/' fichier
mais sed ne fait que recopier littéralement « $path/sauv ».
Et d'après le manuel je crois comprendre que sed ne fait jamais
d'interprétation dans la partie droite.
Comment faire ?
=
Vous souhaitez acquerir votre pack ou des services Mandriva?
Rendez-vous sur http://store.mandriva.com;.
Rejoignez le club Mandriva : http://club.mandriva.com
=


Re: [debutant] Remplacer une chaine par la valeur d'une variable

2006-12-09 Par sujet Christophe Gaubert
Le 09/12/06, gegetel a écrit :

 Dans un fichier texte quelconque, il est possible avec sed de
 remplacer une chaîne de caractères par une autre, voire une
 expression rationnelle par une chaîne de caractères. Par exemple :
 sed -i 's/\/mnt.*\/sauv/\/mnt\/removable-3\/sauv/' fichier
 remplacera dans fichier l'unique chaîne de caractères «
 /mnt/chemin_quelconque/sauv » par « /mnt/removable-3/sauv ».
 Mais comment mettre dans la partie droite une chaîne récupérée avec
 grep et awk dans un autre fichier et contenue dans une variable ?
 J'ai fait des essais avec toutes sortes de parenthèses et
 d'apostrophes à partir de : sed -i 's/\/mnt.*\/sauv/$path\/sauv/'
 fichier mais sed ne fait que recopier littéralement « $path/sauv ».
 Et d'après le manuel je crois comprendre que sed ne fait jamais
 d'interprétation dans la partie droite.
 Comment faire ?

)$ cat a.txt
oh du texte
/mnt/blabla/sauv
foo et bar sont dans un bateau

)$ cat toto.sh
#!/bin/bash

fich_in=a.txt

rep=removable

sed s;/mnt/.*/sauv;/mnt/$rep/sauv; $fich_in

)$ ./toto.sh
oh du texte
/mnt/removable/sauv
foo et bar sont dans un bateau

Sous réserve de corrections par Jipe ;-)

-- 
Christophe
http://ch4tn01r.free.fr/blog

=
Vous souhaitez acquerir votre pack ou des services Mandriva?
Rendez-vous sur http://store.mandriva.com;.
Rejoignez le club Mandriva : http://club.mandriva.com
=


Re: [debutant] Remplacer une chaine par la valeur d'une variable

2006-12-09 Par sujet jipe
On Sat, 09 Dec 2006 12:42:39 +0100
gegetel [EMAIL PROTECTED] wrote:

 Bonjour,
 Dans un fichier texte quelconque, il est possible avec sed de remplacer
 une chaîne de caractères par une autre, voire une expression rationnelle
 par une chaîne de caractères. Par exemple :
 sed -i 's/\/mnt.*\/sauv/\/mnt\/removable-3\/sauv/' fichier
 remplacera dans fichier l'unique chaîne de caractères «
 /mnt/chemin_quelconque/sauv » par « /mnt/removable-3/sauv ».
 Mais comment mettre dans la partie droite une chaîne récupérée avec grep
 et awk dans un autre fichier et contenue dans une variable ? J'ai fait
 des essais avec toutes sortes de parenthèses et d'apostrophes à partir de :
 sed -i 's/\/mnt.*\/sauv/$path\/sauv/' fichier
 mais sed ne fait que recopier littéralement « $path/sauv ».
 Et d'après le manuel je crois comprendre que sed ne fait jamais
 d'interprétation dans la partie droite.
 Comment faire ?
 


un exemple valant mieux qu'une longue explication:

[EMAIL PROTECTED] ~]$ var=foo
[EMAIL PROTECTED] ~]$ echo foo bar | sed 's/bar/$var/'
foo $var
[EMAIL PROTECTED] ~]$ echo foo bar | sed s/bar/$var/
foo foo
[EMAIL PROTECTED] ~]$ 

la différence est dans les '' et 

autre chose, avec sed on peut choisir son délimiteur.
si l'expression contient des '/' on peut utiliser '@' (ou '#' '+' etc)
comme délimiteur et ainsi se passer des '\' ou risquer d'en oublier un.

s@/foo/bar@/bar/foo@ est plus lisible que s/\/foo\/bar/\/bar\/foo/

bye
jipe
=
Vous souhaitez acquerir votre pack ou des services Mandriva?
Rendez-vous sur http://store.mandriva.com;.
Rejoignez le club Mandriva : http://club.mandriva.com
=


Re: [debutant] Remplacer une chaine par la valeur d'une variable

2006-12-09 Par sujet gegetel
Le 09.12.2006 13:41, *jipe* a écrit fort à propos :

 un exemple valant mieux qu'une longue explication:
 
 [EMAIL PROTECTED] ~]$ var=foo
 [EMAIL PROTECTED] ~]$ echo foo bar | sed 's/bar/$var/'
 foo $var
 [EMAIL PROTECTED] ~]$ echo foo bar | sed s/bar/$var/
 foo foo
 [EMAIL PROTECTED] ~]$ 
 
 la différence est dans les '' et 

Merci à tous les deux puisque votre solution est la même. J'avais bien
essayé les , mais ne les avais pas placés aux bons endroits.

 autre chose, avec sed on peut choisir son délimiteur.
 si l'expression contient des '/' on peut utiliser '@' (ou '#' '+' etc)
 comme délimiteur et ainsi se passer des '\' ou risquer d'en oublier un.

En effet, avec le délimiteur habituel j'ai réussi des exercices mais mon
vrai script n'a jamais voulu fonctionner! $smiley_de_circonstance.

Voici donc le script qui aiguillera les sauvegardes par drakbackup vers
le bon répertoire de la bonne partition de mon disque USB. Ce script
modifiant le fichier de configuration de drakbackup en fonction du point
de montage effectif, j'espère éviter désormais les sauvegardes
intempestives dans ma partition racine :

#!/bin/sh
dir=$(grep sdf1 /etc/mtab | awk '{print $2}')
if [ -e $dir/sauv/temoin_de_montage ]; then
sed -i [EMAIL PROTECTED]/[EMAIL PROTECTED]/sauv@
/etc/drakxtools/drakbackup/drakbackup.conf
fi
=
Vous souhaitez acquerir votre pack ou des services Mandriva?
Rendez-vous sur http://store.mandriva.com;.
Rejoignez le club Mandriva : http://club.mandriva.com
=