BASH - remplace variable $

Résolu/Fermé
R1D3M4N Messages postés 86 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 21 novembre 2010 - 1 févr. 2008 à 23:32
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 2 févr. 2008 à 13:02
Bonsoir,

Je suis devant un petit probleme de script bash que je n'arrive pas à résoudre.

Je voudrais faire un script qui modifie certains parametres dans un fichier connus à l'avance.

Par exemple dans un fichier toto dans le repertoire courant je veux remplacer REPERTOIRE par TEST

J'ecris donc un script qui ressemble à ça:

#!/bin/bash
for i in `find . -name "toto" -type f`;do perl -p -i -e 's/REPERTOIRE/$1/gi' $i;done


Et je l'appelle de la maniere suivante:

./script TEST

Le problème est que le $1 présent dans la deuxieme partie ne prends pas la valeur TEST mais rien du coup dans mon fichier il remplace REPERTOIRE par rien....

Si quelqu'un avait une idée car je ne sais vriament pas et je me sens perdu. Merci d'avance!!!
A voir également:

6 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
1 févr. 2008 à 23:36
Salut,

tu peux faire tout simplement
perl -pi -e 's/repertoire/TEST/gi' toto
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
2 févr. 2008 à 09:22
Salut,

Ça marche avec "sed" donc je suppose qu'avec "perl" ce doit être la même chose, essaie comme ça :
perl -p -i -e 's/REPERTOIRE/'"$1"'/gi' "$i"
;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 févr. 2008 à 10:49
Salut,

l'opérateur s/// (s pour substitute) en Perl permet l'interpolation des variables, donc les guillements sont inutiles dans la 2ème partie de l'opérateur s///, à moins qu'on utilise les guillemets comme séparateur de l'opérateur subsitute ;-)
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
2 févr. 2008 à 11:04
Ok, merci pour l'éclaircissement sur ce point ;-))

Par contre comme c'est un shell qui appelle le programme (perl), et que la variable est définie par le shell et non par l'interpréteur "perl", peut être qu'à ce moment là il faut effectivement exclure la variable de l'interpréteur afin quelle soit interprétée par le shell, non ?

;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
2 févr. 2008 à 11:17
il s'agit déjà d'un encapsulation par les apostrophes simples

's/REPERTOIRE/$1/gi'

en plus $1 c'est une variable obtenu par la capture faite par la regex de perl (dans son cas il n'y a aucune capture, donc ma question c'est d'où il sort $1 puisqu'il n'y a pas de capture dont $1 est vide

regarde cet exemple

lami20j@debserv:~$ echo -e 'Voici mon répertoire sur /home/lami20j\n Fin de REPERTOIRE'
Voici mon répertoire sur /home/lami20j
 Fin de REPERTOIRE
lami20j@debserv:~$ echo -e 'Voici mon répertoire sur /home/lami20j\n Fin de REPERTOIRE' | perl -pe 's/r(?:e|é)pertoire/$1/gi'
Voici mon  sur /home/lami20j
 Fin de


comme $1 est vide, en fait je supprime tout simplement el mot répertoire et REPERTOIRE
(?: permet de grouper dans regex sans capture
et voici si je capture dans la regex ($1 n'est plus vide)
lami20j@debserv:~$ echo -e 'Voici mon répertoire sur /home/lami20j\n Fin de REPERTOIRE' | perl -pe 's/r(?:e|é)pertoire/TEST/gi'
Voici mon TEST sur /home/lami20j
 Fin de TEST
lami20j@debserv:~$
et voici juste pour la capture (1er cas c'est correct, 2ème cas $1 est vide)
lami20j@debserv:~$ echo -e 'Voici mon répertoire sur /home/lami20j\n Fin de REPERTOIRE' | perl -ne '/(r(?:e|é)pertoire)/i; print "$1\n"'
répertoire
REPERTOIRE
lami20j@debserv:~$ echo -e 'Voici mon répertoire sur /home/lami20j\n Fin de REPERTOIRE' | perl -ne '/r(?:e|é)pertoire/i; print "$1\n"'


lami20j@debserv:~$


0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897 > lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019
2 févr. 2008 à 11:20
donc ma question c'est d'où il sort $1
J'ecris donc un script qui ressemble à ça:

#!/bin/bash
for i in `find . -name "toto" -type f`;do perl -p -i -e 's/REPERTOIRE/$1/gi' $i;done


Et je l'appelle de la maniere suivante:
./script TEST


;-))
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
2 févr. 2008 à 11:26
ah, d'accord, je n'ai pas lu plus bas ;-)
d'où la source de ma confusion, en fait $1 c'est l'argument passé en ligne de commande ;-)

toutefois drôle façon d'écrire
pourquoi pas un script Perl directement?!

bon je dois partire, mais je vais écrire en p'tit exemple en Perl
bonne journée
0
R1D3M4N Messages postés 86 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 21 novembre 2010 29
2 févr. 2008 à 09:50
Et bien tu geres toujours autant. Javais suivie quelque un de tes posts sur CCM et je dois dire que tu me bluffe à chaque fois.

Encore merci a toi jipicy
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 897
2 févr. 2008 à 10:10
De rien ;-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 févr. 2008 à 10:46
Salut,

la variable $1 contient la capture faite par la 1ère paranthèse ouvrante dans la regex
je ne vois aucune paranthèse dans ta regex, donc $1 contient quoi?

comme tu veux remplacer REPERTOIRE avec TEST il n'y a pas de raison d'utiliser $1
0
R1D3M4N Messages postés 86 Date d'inscription lundi 9 octobre 2006 Statut Membre Dernière intervention 21 novembre 2010 29
2 févr. 2008 à 11:59
oui sauf que TEST est un parametre. C'etait un exemple. Je veux remplacer REPERTOIRE par un argument passé au script.
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
2 févr. 2008 à 13:02
je n'ai pas lu le message jusqu'au bout, d'où ma confusion ;-)

voici en Perl (à toid'adapter si jamais t'interesses ;-)
le script doit être lancé avec l'argument
./script.pl TEST 
n'oublie pas de le rendre d'abord exécutable ;-)
#!/usr/bin/perl -i.orig
use strict;use warnings;
use File::Find;

find sub {push @ARGV,$File::Find::name if -f and /^toto$/},"/home/lami20j";
my $p = shift;for(@ARGV){(s/REPERTOIRE/$p/gi,print) while(<>)}
__END__
0