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
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
A voir également:
- BASH - remplace variable $
- Quel site remplace coco - Accueil - Réseaux sociaux
- Remplaçant de Coco : quelles solutions pour tchater gratuitement en ligne ? - Accueil - Réseaux sociaux
- Qui remplace uptobox - Accueil - Services en ligne
- Vba range avec variable ✓ - Forum VB / VBA
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
1 févr. 2008 à 23:36
Salut,
tu peux faire tout simplement
tu peux faire tout simplement
perl -pi -e 's/repertoire/TEST/gi' toto
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
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 :
Ç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";-))
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
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 ;-)
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 ;-)
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
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 ?
;-))
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 ?
;-))
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
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
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:~$
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
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
;-))
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
;-))
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
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
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
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
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
Encore merci a toi jipicy
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
2 févr. 2008 à 10:10
De rien ;-))
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
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
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
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
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.
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
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
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__