2010-07-06 2 views
1

Je dois obtenir un nom d'utilisateur à partir d'un chemin Unix avec ce format: /home/users/myusername/projet/nombre/fichiersnom d'utilisateur de chemin UNIX Extraction en utilisant Regex

Je veux juste « myusername » J'ai essayé depuis près d'une heure et je suis complètement désemparé.

Une idée?

Merci!

+1

Quelle langue utilisez-vous? – psmears

+1

Notez que le nom du répertoire de base n'est pas nécessairement le même que le nom d'utilisateur.Pour obtenir le nom d'utilisateur réel à partir du répertoire personnel, vous devez parcourir la base de données 'passwd'. – Philipp

Répondre

0
(\/home\/users\/)([^\/]+) 

Le 2ème groupe de capture (index 1) sera myusername

5

Peut-être juste /home/users/([a-zA-Z0-9_\-]*)/.*?

Notez que la partie critique [a-zA-Z0-9_\-]* doit contenir tous les caractères valides pour les noms d'utilisateur UNIX. J'ai pris de here, qu'un nom d'utilisateur ne doit contenir que des chiffres, des caractères, des tirets et des traits de soulignement.

Notez également que le nom d'utilisateur extrait n'est pas l'intégralité de la correspondance, mais le premier groupe (indiqué par (...)).

+0

Il dit que son chemin est '/ home/users/myusername/project/number/files'. Votre expression rationnelle peut seulement trouver 'users'. –

+0

@TK: Vous avez complètement raison. Mais je pense qu'il sera assez intelligent pour l'adapter à ses besoins. – phimuemue

+0

Vous devez également faire attention à l'ancrage. Tout utilisateur peut créer le fichier '/ tmp/home/users/root/project/number/files' :-) – psmears

2

La meilleure réponse à cette question dépend de ce que vous essayez d'atteindre. Si vous voulez connaître l'utilisateur qui est propriétaire de ce fichier, vous pouvez utiliser la commande stat, ce qui a malheureusement syntaxe légèrement différente en fonction du système d'exploitation mais les deux commandes suivantes fonctionnent

Max OS/X

stat -f '%Su' /home/users/myusername/project/number/files 

Redhat/Fedora/CentOS

stat -c '%U' /home/users/myusername/project/number/files 

Si vous ne voulez vraiment la chaîne suivante/home/utilisateurs puis l'une ou l'autre des Regexes fourni fera ci-dessus, vous pouvez l'utiliser dans un script bash comme suit (Mac OS/X)

USERNAME=$(echo '/home/users/myusername/project/number/files' | \ 
    sed -E -e 's!^/home/users/([^/]+)/.*$!\1!g') 
1

dans une coquille bourne quelque chose comme:

 
string="/home/users/STRINGWEWANT/some/subdir/here" 
echo $string | awk -F\/ '{print $3}' 

serait une option, en supposant toujours son troisième élément du chemin. Il y a plus léger qui utilisent uniquement la coque builtins:

 
echo ${x#*users/} 

dépouillera tout ce jusqu'à et y compris des utilisateurs/'

 
echo ${y%%/*} 

dépouillera le reste.

Donc, pour mettre tout cela ensemble:

 
export path="/home/users/STRINGWEWABT/some/other/dirs" 
export y=`echo ${path#*users/}` && echo ${y%%/*} 
STRINGWEWABT 

Existe aussi la page de manuel bash et la recherche de « Paramètre Expansion »

Questions connexes