2010-11-22 7 views
3

nous avons essayé de trouver le nom d'utilisateur d'une url Mercurial:trouver une sous-chaîne dans une variable bash

default = ssh://[email protected]//srv/hg/repo 

On suppose qu'il ya toujours un nom d'utilisateur, je suis venu avec:

tmp=${a#*//} 
user=${tmp%%@*} 

est-il un moyen de le faire en une ligne?

+0

L'utilisation d'un point-virgule entre les deux opérations (au lieu d'un saut de ligne) compte-t-elle? –

Répondre

0

Non compris dans bash lui-même. Vous devez déléguer à un outil externe tel que sed.

0

Vous n'êtes pas familier avec Mercurial, mais en utilisant votre URL, vous pouvez faire

echo 'ssh://[email protected]/srv/hg/repo' |grep -E --only-matching '\[email protected]' |cut --delimiter=\@ -f 1 

Probablement pas la façon la plus efficace avec les deux tuyaux, mais fonctionne.

3

Vous avez besoin de plus d'une instruction ou d'appeler des outils externes. Je pense que sed est le meilleur pour ça.

sed -r -e 's|.*://(.*)@.*|\1|' <<< "$default" 
+0

Je ne me souviens pas d'avoir vu cette construction avant - le '<<<' - alors j'ai juste appris quelque chose de nouveau. Habituellement, je 'echo' la variable en' sed'; J'imagine que cette construction est plus efficace? – Will

+0

J'imagine que c'est le cas, car un écho et un tuyau signifient un tout autre sous-shell alors qu'une chaîne ici est manipulée en cours. – Sorpigal

4

En supposant que votre chaîne est dans une variable comme ceci:

url='default = ssh://[email protected]//srv/hg/repo' 

Vous pouvez faire:

[[ $url =~ //([^@]*)@ ]] 

Alors votre nom d'utilisateur est ici:

echo ${BASH_REMATCH[1]} 

Cela fonctionne dans les versions 3.2 et supérieures de Bash.

Questions connexes