A seconda di ciò che fai e non sai in anticipo su cosa pip
verrà prodotto, potresti decidere di fare grep
qualcosa di diverso /usr.*
.
Se sai che la directory inizia con/usr
(e che appare alla fine della riga di output da pip
, e che /usr
non appare da nessuna parte sulla riga prima del nome della directory), allora questa è una buona scelta; La risposta di Heemayl ti dice come.
Se la ragione per cui sai che inizia /usr
è che hai appena eseguito il comando e conosci la directory in cui vuoi cambiare, ti suggerisco la soluzione più semplice di eseguire il comando cd /usr/lib64/python2.7/site-packages
. Questo è meno digitando anche se non si utilizza il completamento della scheda .
Altrimenti, potresti scegliere una regexp diversa a seconda di ciò che sai sull'output da analizzare. Tutte le alternative seguenti presuppongono ancora che il nome della directory appaia alla fine della riga, ma le altre ipotesi variano.
Se sai che il nome della directory è assoluto (cioè inizia con a /
) e non /
appare sulla riga prima del nome della directory , puoi usare lo stesso regexp della risposta di heemayl ma con /
invece di /usr
:
cd "$(pip install django | grep -o '/.*')"
Questo corrisponde a /
seguito da zero o più ( *
) di qualsiasi carattere ( .
).
Se sai che il nome della directory non contiene spazi bianchi orizzontali (senza spazi o tabulazioni) e appare alla fine della riga , puoi usare:
cd "$(pip install django | grep -oP '[^\h]+$')"
Qui ho usato un Perge regexp ( -P
) perché l' \h
abbreviazione (for [:blank:]
) rende questo testo più facile da scrivere e da leggere rispetto a un regexp ( -E
) esteso equivalente . Questo corrisponde a uno o più ( +
) di qualsiasi carattere in una classe di caratteri ( [
]
) che non è ( ^
) uno spazio o una scheda ( \h
).
Se sai che il nome della directory è immediatamente preceduto da uno in
spazio bianco orizzontale (ad esempio, imbottito sia a sinistra che a destra con spazi vuoti), e che questa è l'unica occorrenza della in
riga , puoi usare:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
Questo utilizza un'asserzione look-behind positiva di larghezza zero ( \K
) per abbinare uno o più caratteri ( .+
) che compaiono dopo uno spazio o una scheda ( \h
) in
e un altro uno o più spazi o tab ( \h+
), senza effettivamente includere in
e gli spazi vuoti circondandolo nella partita. Le asserzioni intorno sono una caratteristica delle espressioni regolari Perl.
Anche il modello avrebbe funzionato, ma dobbiamo solo cercare uno spazio prima , indipendentemente da quanti sono presenti. Al contrario, dobbiamo abbinare tutti gli spazi vuoti dopo , altrimenti non verrebbero eliminati e verrebbero abbinati come parte del nome della directory.\h+in\h+\K.+
in
in
\K
Se sai che il nome della directory è immediatamente preceduto dall'ultima occorrenza della riga in
seguita da uno spazio bianco orizzontale , puoi usare:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
In questo caso, l'asserzione look-behind positiva a larghezza zero stessa contiene un'asserzione look-ahead negativa a larghezza zero ( (?!
)
).
L' !
aspetto sembra difficile da sfuggire elegantemente; il metodo che ho usato per impedirgli di innescare l' espansione della cronologia della shell prima di essere passato grep
è disabilitare temporaneamente l'espansione della cronologia ( set +H
) prima di eseguire il comando e riattivarlo ( set -H
) in seguito. Se lo stai usando in uno script e il tuo script non contiene set -H
, non è necessario farlo poiché l'espansione della cronologia è abilitata automaticamente solo quando una shell viene eseguita in modo interattivo.
Infine, nota che nessuno di questi, né la risposta di Heemayl , stanno effettivamente eseguendo il piping dell'output di grep
to cd
(sebbene l'output di pip
sia ancora in fase di piping grep
). Invece delle pipe , lo strumento appropriato per questo lavoro è la sostituzione dei comandi .