Selon ce que vous faites et ne savez pas à l'avance ce qui pip
va sortir, vous pouvez décider de faire grep
autre chose que /usr.*
.
Si vous savez que le répertoire commence par/usr
(et qu'il apparaît à la fin de la ligne de sortie de pip
, et qu'il /usr
n'apparaît nulle part sur la ligne avant le nom du répertoire), alors c'est un bon choix; la réponse de heemayl vous explique comment.
Si la raison pour laquelle vous savez que cela commence par le /usr
fait que vous venez d'exécuter la commande et que vous connaissez le répertoire dans lequel vous souhaitez changer, je suggère la solution la plus simple pour exécuter la commande cd /usr/lib64/python2.7/site-packages
. C'est moins de frappe même si vous n'utilisez pas la complétion de tabulation .
Sinon, vous pouvez choisir une expression rationnelle différente en fonction de ce que vous savez sur 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 que le nom du répertoire est absolu (c'est-à-dire qu'il commence par un /
) et qu'aucun /
n'apparaît sur la ligne avant le nom du répertoire , vous pouvez utiliser la même expression rationnelle que dans 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 n'importe quel caractère ( .
).
Si vous savez que le nom du répertoire ne contient aucun espace horizontal (aucun espace ni tabulation) et apparaît à la fin de la ligne , vous pouvez utiliser:
cd "$(pip install django | grep -oP '[^\h]+$')"
Ici, j'ai utilisé une expression rationnelle Perl ( -P
) parce que l' \h
abréviation (pour [:blank:]
) rend cela plus facile à taper et à lire qu'une expression régulière étendue équivalente ( -E
). Cela correspond à un ou plusieurs ( +
) de n'importe quel caractère d'une classe de caractères ( [
]
) qui n'est pas ( ^
) un espace ou une tabulation ( \h
).
Si vous savez que le nom du répertoire est immédiatement précédé d' in
un espace blanc horizontal (c.-à-d. Rempli à la fois à gauche et à droite avec des espaces) et que c'est la seule occurrence de ce type in
sur la ligne , vous pouvez utiliser:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
Cela utilise une assertion de regard positif de largeur nulle ( \K
) pour faire 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 réellement inclure in
et les espaces vides. l'entourant dans le match. Les assertions de regard sont une caractéristique des expressions régulières de Perl.
Le modèle aurait également fonctionné, mais nous n'avons besoin que de rechercher un blanc avant , quel que soit le nombre. En revanche, nous devons faire correspondre tous les blancs après , sinon ils ne seraient pas supprimés et ils seraient mis en correspondance dans le nom du répertoire.\h+in\h+\K.+
in
in
\K
Si vous savez que le nom du répertoire est immédiatement précédé de la dernière occurrence de la ligne in
suivi d'un espace horizontal , vous pouvez utiliser:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
Là, l'assertion de recherche positive de largeur nulle elle-même contient une assertion de recherche négative de largeur nulle ( (?!
)
).
Le !
apparaît de manière à être difficile à échapper avec élégance; la méthode que j'ai utilisée pour l'empêcher de déclencher l'expansion de l'historique du shell avant d'être transmise 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 l'utilisez dans un script et que votre script n'en contient pas 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 ceux-ci, ni la réponse de heemayl , ne dirigent réellement la sortie de grep
vers cd
(bien que la sortie de pip
soit toujours dirigée vers grep
). Plutôt que des tuyaux , l'outil approprié pour ce travail est la substitution de commandes .
` and
'', et vous avez utilisé des guillemets simples autour de l'expression grep.!
il n'est pas cité avec'
-quotes, car les'
-quotes sont eux-mêmes cités. La complexité de la commande facilite la mauvaise estimation de son effet, mais apparemment en raison de l'ordre des extensions (!
est précoce), il finit par fonctionner commex=foo; echo "'$x'"
(->'foo'
). La suppression des"
guillemets externes entraînerait!
un'
guillemet et empêcherait l'expansion de l'historique, maiscd
échouerait alors si le répertoire avait un espace dans son nom.