Comment faire passer les méta caractère tel que "(" dans le script suivant :
#!/usr/bin/perl -w
$who = `who | grep -v \(:`;
print "$who";
J'aimerais reprendre ce bout de code pour faire mon watchlog perso... mais il bloque à la parenthèse après le grep.
Dans le shell cette commande fonctionne très bien.
Merci de votre aide
# pkoi perl ?
Posté par NeoX . Évalué à 2.
ensuite il doit falloir faire un
grep -v ' chaine '
[^] # Re: pkoi perl ?
Posté par Frédéric Perrin (site web personnel) . Évalué à 2.
open WHO, "|-", "who";
while (<$who>) {
next if m/\(:/;
my ($user) = split;
print "$user est connecté\n";
}
close $who;
# enlever le grep ...
Posté par arthurr (site web personnel) . Évalué à 2.
#!/usr/bin/perl -w
my @who = `who`;
foreach(@who){
next if($_=~m/\(:/);
print $_;
}
# un grep peut faire l'affaire...
Posté par Joachim IONOFF . Évalué à 2.
$who = `who | grep -v '(:'` ;
print $who;
# perl is good
Posté par barmic . Évalué à 3.
Il y a deux règles que je m'applique continuellement en perl :
- ne jamais utiliser /bin/grep
- ne jamais utiliser /bin/sed
Dans ton cas tu dois pouvoir faire quelque chose comme :
#!/usr/bin/perl -w
use strict;
my $who = (grep {!/(:/} `who`)[0];
print "$who";
Tu appelle la commande who tu parse le résultat avec le grep de perl qui renvoie un tableau et tu prend que le premier élément (perl renvoie un tableau). Au niveau des protections je saurais pas te dire mais le problème doit être beaucoup plus simple.
Tous les contenus que j'écris ici sont sous licence CC0 (j'abandonne autant que possible mes droits d'auteur sur mes écrits)
# La solution de base et l’équivalent sans grep externe
Posté par Arthur Accroc . Évalué à 2.
Tu veux quoter la parenthèse pour le shell, pas pour Perl. Et pour envoyer un \ au shell, il faut le quoter lui-même :
#!/usr/bin/perl -w
$who = `who | grep -v \\(:`;
print "$who";
Cela dit, la remarque de Michel reste très pertinente : il serait stupide d’utiliser des outils externes moins puissants que les fonctions intégrées à Perl (surtout si c’est pour avoir du mal après avec des appels alambiqués…).
L’équivalent le plus proche :
#!/usr/bin/perl -w
use strict;
my @who = grep !/\(:/, `who`;
print @who;
Note : là, le \ n’est pas là pour le shell, mais parce qu’avec un grep moins limité que le grep de base, les parenthèses sont des caractères spéciaux (c’est déjà le cas avec egrep).
« Le fascisme c’est la gangrène, à Santiago comme à Paris. » — Renaud, Hexagone
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.