W zależności od tego, co robisz i czego wcześniej nie wiesz o pipwynikach, możesz zdecydować się grepna coś innego niż /usr.*.
Jeśli wiesz, że katalog zaczyna się od/usr (i że pojawia się na końcu wiersza danych wyjściowych z pip, i że /usrnie pojawia się nigdzie w linii przed nazwą katalogu), to dobry wybór; Odpowiedź heemayla mówi ci jak.
Jeśli powodem wiesz, że zaczyna się /usrto, że wystarczy uruchomić komendę i poznać katalog, który chcesz zmienić, proponuję prostsze rozwiązanie uruchamiając komendę cd /usr/lib64/python2.7/site-packages. To mniej pisania, nawet jeśli nie korzystasz z uzupełniania tabulatorów .
W przeciwnym razie możesz wybrać inne wyrażenie regularne w zależności od tego, co wiesz o analizowanym wyjściu. Wszystkie poniższe opcje nadal zakładają, że nazwa katalogu pojawia się na końcu wiersza, ale inne założenia są różne.
Jeśli wiesz, że nazwa katalogu jest bezwzględna (tzn. Zaczyna się od a /) i nie /pojawia się w wierszu przed nazwą katalogu , możesz użyć tego samego wyrażenia regularnego, co w odpowiedzi heemayl, ale /zamiast /usr:
cd "$(pip install django | grep -o '/.*')"
Odpowiada to /zeru lub więcej ( *) dowolnego znaku ( .).
Jeśli wiesz, że nazwa katalogu nie zawiera poziomych białych znaków (bez spacji i tabulatorów) i jest wyświetlana na końcu wiersza , możesz użyć:
cd "$(pip install django | grep -oP '[^\h]+$')"
Tutaj użyłem wyrażenia regularnego Perl ( -P), ponieważ \hskrót (for [:blank:]) ułatwia to pisanie i czytanie niż równoważne rozszerzone wyrażenie regularne ( -E). Dopasowuje jeden lub więcej ( +) dowolnego znaku w klasie znaków ( [ ]), który nie jest ( ^) spacją ani tabulatorem ( \h).
Jeśli wiesz, że nazwa katalogu jest bezpośrednio poprzedzona inotoczeniem poziomymi białymi spacjami (tj. Wypełnionymi po lewej i prawej stronie spacjami) i że jest to jedyne takie wystąpienie inna linii , możesz użyć:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
Korzysta z asercji dodatniej zerowej szerokości ( \K), aby dopasować jeden lub więcej znaków ( .+) pojawiających się po spacji lub tabulatorze ( \h) inoraz inną jedną lub więcej spacji lub tabulatorów ( \h+), bez faktycznego uwzględnienia ini pustych spacji otaczając go w meczu. Asercje obejrzane są funkcją wyrażeń regularnych Perla.
Wzorzec również by zadziałał, ale musimy wcześniej szukać tylko jednego pustego miejsca , niezależnie od tego, ile jest obecnych. W przeciwieństwie do tego musimy dopasować wszystkie puste pola później , w przeciwnym razie nie zostaną odrzucone i zostaną dopasowane jako część nazwy katalogu.\h+in\h+\K.+inin\K
Jeśli wiesz, że nazwa katalogu jest poprzedzona ostatnim wystąpieniem linii, ina następnie poziomą białą spacją , możesz użyć:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
Tam samo twierdzenie o dodatniej zerowej szerokości zawiera ujemne aserowanie wyprzedzające o zerowej szerokości ( (?! )).
Gdy !pojawia się w taki sposób, że trudno uniknąć elegancko; metoda, której użyłem, aby zapobiec wyzwalaniu ekspansji historii powłoki przed przekazaniem, grepto tymczasowe wyłączenie ekspansji historii ( set +H) przed uruchomieniem polecenia i ponowne włączenie go ( set -H) później. Jeśli używasz tego w skrypcie, a twój skrypt nie zawiera set -H, nie musisz tego robić, ponieważ rozszerzanie historii jest włączane automatycznie tylko wtedy, gdy powłoka działa interaktywnie.
Na koniec zauważ, że żadna z nich, ani odpowiedź heemayla , nie przesyłają potokowo danych wyjściowych grepdo cd(choć dane wyjściowe pipsą nadal przesyłane do grep). Zamiast rur , odpowiednim narzędziem do tego zadania jest zastępowanie poleceń .