En fonction de ce que vous savez ou ne savez pas à l'avance sur ce qu'il faut faire pip
vous pouvez décider de grep
pour quelque chose d'autre que /usr.*
.
Si vous savez le répertoire commence par /usr
(et qu'il apparaît à la fin de la ligne de sortie de l'application pip
et que /usr
n'apparaît nulle part sur la ligne précédant le nom du répertoire), alors c'est un bon choix ; La réponse de heemayl vous explique comment.
Si le raison vous savez que ça commence par /usr
est que vous venez d'exécuter la commande et que vous connaissez le répertoire dans lequel vous voulez changer, je suggère la solution la plus simple qui consiste à exécuter la commande cd /usr/lib64/python2.7/site-packages
. Il s'agit de moins de frappe même si vous n'utilisez pas de tabulation .
Sinon, vous pouvez choisir une regexp différente en fonction de ce que vous savez de la sortie analysée. Toutes les alternatives ci-dessous supposent toujours que le nom du répertoire apparaît à la fin de la ligne, mais les autres hypothèses varient.
Si vous savez le nom du répertoire est absolu (c'est-à-dire qu'il commence par un /
) et non /
apparaît sur la ligne précédant le nom du répertoire vous pouvez utiliser la même expression rationnelle que dans le cas de La réponse de heemayl mais avec /
au lieu de /usr
:
cd "$(pip install django | grep -o '/.*')"
Cela correspond à un /
suivi de zéro ou plus ( *
) de tout caractère ( .
).
Si vous savez le nom du répertoire ne contient pas d'espace horizontal (sans espace ni tabulation) et apparaît à la fin de la ligne vous pouvez l'utiliser :
cd "$(pip install django | grep -oP '[^\h]+$')"
Ici, j'ai utilisé un regexp en Perl ( -P
) parce que le \h
abréviation (pour [:blank:]
) rend la saisie et la lecture plus faciles qu'une regexp étendue équivalente ( -E
). Cela correspond à un ou plusieurs ( +
) de tout caractère dans une classe de caractères ( [
]
) qui est no ( ^
) un espace ou une tabulation ( \h
).
Si vous savez que t e nom du répertoire est immédiatement précédé de in
entouré d'un espace blanc horizontal (c'est-à-dire qu'elle est remplie de blancs à gauche et à droite), et que c'est la seule occurrence de ce type de in
sur la ligne vous pouvez l'utiliser :
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
Cela utilise une assertion positive de type "look-behind" de largeur nulle ( \K
) pour correspondre à un ou plusieurs caractères ( .+
) qui apparaissent après un espace ou une tabulation ( \h
), in
et un ou plusieurs autres espaces ou tabulations ( \h+
), sans inclure réellement in
et les espaces vides qui l'entourent dans le match. Assertions de contournement sont une caractéristique des expressions régulières Perl.
Le motif \h**+**in\h+\K.+
aurait également fonctionné, mais nous n'avons besoin de chercher qu'un seul blanc avant in
quel que soit le nombre de personnes présentes. En revanche, nous devons faire correspondre tous les blancs après in
ou ils ne seraient pas jetés par \K
et ils seront reconnus comme faisant partie du nom du répertoire.
Si vous savez le nom du répertoire est immédiatement précédé du numéro de la ligne. dernier l'apparition de in
suivi d'un espace blanc horizontal vous pouvez l'utiliser :
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
Là, l'assertion positive look-behind de largeur zéro contient elle-même une assertion négative look-ahead de largeur zéro ( (?!
)
).
El !
apparaît d'une manière telle qu'il est difficile pour s'échapper de manière élégante ; la méthode que j'ai utilisée pour l'empêcher de déclencher Shell. expansion de l'histoire avant d'être transmis à grep
est de désactiver temporairement l'expansion de l'historique ( set +H
) avant d'exécuter la commande et de la réactiver ( set -H
) par la suite. Si vous utilisez ceci dans un script et que votre script ne contient pas de set -H
vous n'avez pas besoin de le faire car l'expansion de l'historique n'est activée automatiquement que lorsqu'un Shell s'exécute de manière interactive.
Enfin, notez qu'aucun de ces éléments, ni La réponse de heemayl sont en fait en train d'acheminer la sortie de grep
a cd
(bien que la sortie de pip
est toujours acheminé vers grep
). Plutôt que de tuyaux l'outil approprié pour ce travail est substitution de commande .