2010-03-31 6 views
1

je trouve un script qui a l'extrait suivant: -Comment cette expression régulière travaille

userid=`expr "\`id\`" : ".*uid=[0-9]*(\(.[0-9a-z]*\)) .*"` 

Il renvoie le code d'utilisateur.

Quand j'ai essayé d'apprendre comment il fait: -

#id 
#uid=11008(adilm) gid=1200(cvs),1400(build) 

Je réalise que assortit l'ID utilisateur ([0-9a-z] *.). Mais si j'ai placé comme ci-dessous:

#userid=`expr "uid=11008(ADILM) gid=1200(cvs),1400(build)" : ".*uid=[0-9]*(\(.[0-9a-z]*\)) .*"` 
#echo $userid 
ADILM 

Cela fonctionne. Selon ma compréhension '.' correspond à ADILM. Mais quand j'ai enlevé '.' comme ci-dessous: -

#userid=`expr "uid=11008(ADILM) gid=1200(cvs),1400(build)" : ".*uid=[0-9]*(\([0-9a-z]*\)) .*"` 
#echo $userid 
ADILM 

Il fonctionne toujours comment? Nous avons seulement fourni des lettres minuscules mais cela fonctionne toujours.

Répondre

3
  • La sous-expression (\(.[0-9a-z]*\)) correspond à un groupe contenant les crochets ainsi que l'identificateur d'utilisateur.
  • Le point à l'intérieur de cette expression rationnelle correspond uniquement au premier caractère et tous les autres doivent être minuscules ou numériques de toute façon.
  • Donc évidemment l'expression rationnelle ici n'est pas sensible à la casse (option i) par défaut. Comme votre nom d'utilisateur est seulement [a-z0-9] il correspond toujours.
  • Je ne pense pas que le point ait du sens. Y a-t-il des noms d'utilisateur valides ne commençant pas par une lettre? Le point est là pour s'assurer que le nom d'utilisateur est long d'au moins un caractère.
  • Mieux pourrait être alors (\([0-9a-z]+\)).
+0

Comment rendre la casse sensible dans expr? – Adil

+0

@Peter j'ai lu que "L'opérateur: peut remplacer pour match." J'ai essayé 'expr match 'uid = 11008 (ADILM) gid = gid = 1200 (cvs), 1400 (build)" ". * Uid = [0-9] * (\ (. [0-9a-z] * \)). * "' mais ça ne marche pas. Il semble que match soit sensible à la casse mais: est insensible à la casse (contrairement à ce qui est mentionné dans la page man et les guides) – Adil

+0

Doit être quelque chose comme ça. Je ne sais pas si bien. –

0

cela n'explique pas l'expression rationnelle, mais d'autres façons d'obtenir votre identifiant.

$ id -u -n 

$ id|sed 's/uid=[0-9]*(//;s/).*//' 
Questions connexes