BASH - remplace variable $
Résolu
R1D3M4N
Messages postés
89
Statut
Membre
-
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
lami20j Messages postés 21644 Statut Modérateur, Contributeur sécurité -
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!!!
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:
- BASH - remplace variable $
- Quel site remplace coco - Accueil - Réseaux sociaux
- Fermeture de Coco : les internautes à la recherche d'un remplaçant - Accueil - Réseaux sociaux
- Bingo bash free - Télécharger - Divers Jeux
- Bash do while ✓ - Forum Shell
- Bash addition ✓ - Forum Shell
6 réponses
Salut,
Ça marche avec "sed" donc je suppose qu'avec "perl" ce doit être la même chose, essaie comme ça :
Ç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";-))
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 ?
;-))
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 ?
;-))
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
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)
'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:~$
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
Encore merci a toi jipicy
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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
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
oui sauf que TEST est un parametre. C'etait un exemple. Je veux remplacer REPERTOIRE par un argument passé au script.
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
voici en Perl (à toid'adapter si jamais t'interesses ;-)
le script doit être lancé avec l'argument
./script.pl TESTn'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__