[debutant] Remplacer une chaine par la valeur d'une variable
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
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
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
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 =