Rechercher : dans
Par :

BASH - remplace variable $

Dernière réponse le 2 fév 2008 à 13:02:27 R1D3M4N, le 1 fév 2008 à 23:32:43 
 Signaler ce message aux modérateurs

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!!!

Configuration: Debian

Meilleures réponses pour « BASH remplace variable $ » dans :
[Bash] La variable d'environnement PATH Voir La variable d'environnement PATH I. Préambule II. C'est quoi le shell ? III. Définition IV. Séance de dissection V. Ajouter un répertoire à la variable PATH VI. Et puis... I. Préambule Sous les systèmes GNU/Linux qu'on le veuille ou...
Le remplacement de variables en shell Bash Voir Le remplacement de variables Introduction Il peut s'avérer utile de s'assurer qu'une variable est bien définie avant de procéder à son remplacement, ou tout simplement de s'assurer que celle-ci n'est pas vide, et dans ce cas de l'initialiser avec...
Comment récupérer le résultat d'une commande dans une variable VoirComment récupérer le résultat d'une commande dans une variable Préambule Syntaxe Exemples Préambule Il est bien souvent nécessaire de récupérer le résultat d'une commande (ou de son code retour) dans une variable afin de pouvoir...
Modifier une variable en lecture seule VoirSolution 1 Une variable déclarée en lecture seule ne peut pas être modifiée dans le processus en cours. Toutefois, si la variable est exportée dans un shell fils, elle pourra être modifiée.#!/bin/bash if [ "$PROC_PID" != "$PPID" ]; then ...
[Shell] Tester une variable numérique VoirTester une variable numérique    Préambule Dans un environnement "shell", les variables sont, par défaut, de type "chaîne de caractères". De ce fait il n'est pas possible de déclarer une variable de type "entier" (enfin, ceci n'est pas tout à...
Javascript - Les variables VoirLe concept de variable Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. En Javascript, les noms de variables peuvent être aussi long que l'on désire,...
Variables d'environnement VoirVariables d'environnement Une variable d'environnement est une valeur dynamique, chargée en mémoire, pouvant être utilisée par plusieurs processus fonctionnant simultanément. Sur la plupart des systèmes d'exploitation, les emplacement de certaines...
PHP - Les variables VoirConcept de variable avec PHP Une variable est un objet repéré par son nom, pouvant contenir des données, qui pourront être modifiées lors de l'exécution du programme. Les variables en langage PHP peuvent être de trois...

1

lami20j, le 1 fév 2008 à 23:36:08

Salut,

tu peux faire tout simplement

perl -pi -e 's/repertoire/TEST/gi' toto

lami20j

Répondre à lami20j

2

jipicy, le 2 fév 2008 à 09:22:58

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"
;-))

Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

6

lami20j, le 2 fév 2008 à 10:49:22

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 ;-)
lami20j

Répondre à lami20j

7

jipicy, le 2 fév 2008 à 11:04:22

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 ?

;-))
Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

8

lami20j, le 2 fév 2008 à 11:17:06

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:~$



lami20j

Répondre à lami20j

9

jipicy, le 2 fév 2008 à 11:20:25

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


;-))

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

10

lami20j, le 2 fév 2008 à 11:26:40

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
lami20j

Répondre à lami20j

11

jipicy, le 2 fév 2008 à 11:32:54

Ok, @+, bonne journée à toi aussi ;-))

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

3

R1D3M4N, le 2 fév 2008 à 09:50:35

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

Répondre à R1D3M4N

4

jipicy, le 2 fév 2008 à 10:10:55

De rien ;-))

Z'@+...che.

JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

5

lami20j, le 2 fév 2008 à 10:46:00

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
lami20j

Répondre à lami20j

12

R1D3M4N, le 2 fév 2008 à 11:59:37

Oui sauf que TEST est un parametre. C'etait un exemple. Je veux remplacer REPERTOIRE par un argument passé au script.

Répondre à R1D3M4N

13

 lami20j, le 2 fév 2008 à 13:02:27

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__

lami20j

Répondre à lami20j