Залежно від того, що ви робите, і не знаєте заздалегідь про те, що pip
вийде, ви можете зважитися на grep
щось інше, ніж /usr.*
.
Якщо ви знаєте, що каталог починається з/usr
(і що він з’являється в кінці рядка виводу з pip
, і /usr
він не з’являється ніде в рядку перед назвою каталогу), то це прекрасний вибір; Відповідь heemayl говорить вам, як.
Якщо причина ви знаєте , що починається з /usr
те , що ви просто запустити команду і знати директорію , яку ви хочете змінити, я пропоную просте рішення , виконавши команду cd /usr/lib64/python2.7/site-packages
. Це менше вводити текст, навіть якщо ви не використовуєте доповнення вкладки .
В іншому випадку ви можете вибрати інше регулярне вираження залежно від того, що ви знаєте про вихідний аналіз. Усі наведені нижче альтернативи все ще припускають, що ім’я каталогу відображається в кінці рядка, але інші припущення змінюються.
Якщо ви знаєте, що ім'я каталогу абсолютне (тобто починається з а /
) і /
в рядку перед іменем каталогу не відображається , ви можете використовувати те саме, що і у відповіді heemayl, але /
замість /usr
:
cd "$(pip install django | grep -o '/.*')"
Це відповідає /
наступному нулю або більше ( *
) будь-якого символу ( .
).
Якщо ви знаєте, що ім'я каталогу не містить горизонтальної пробілу (немає пробілів і вкладок) і відображається в кінці рядка , ви можете використовувати:
cd "$(pip install django | grep -oP '[^\h]+$')"
Тут я використав regexp ( -P
) Perl, тому що \h
абревіатура (for [:blank:]
) робить це легше набирати та читати, ніж еквівалентний розширений regexp ( -E
). Це відповідає одному або більше ( +
) будь-яких символів у класі символів ( [
]
), який не є ( ^
) пробілом чи вкладкою ( \h
).
Якщо вам відомо, що ім'я каталогів безпосередньо передує in
оточеним горизонтальним пробілом (тобто, з лівою та правою сторонами прокладені пробілами), і що це єдине подібне виникнення in
у рядку , ви можете використовувати:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
При цьому використовується позитивне твердження "нульової ширини" ( \K
), щоб відповідати одному або більше символів ( .+
), що з'являються після пробілу чи вкладки ( \h
) in
, та іншого одного або декількох пробілів чи вкладок ( \h+
), не включаючи фактично in
і порожні пробіли оточуючи його в матчі. Оглядові твердження - особливість регулярних виразів Perl.
Шаблон також спрацював би, але нам потрібно лише шукати один бланк раніше , незалежно від кількості присутніх. На відміну від цього, ми повинні відповідати всі пробіли після , інакше вони не будуть відкинуті, і вони будуть узгоджені як частина імені каталогу.\h+in\h+\K.+
in
in
\K
Якщо вам відомо, що ім'я каталогу безпосередньо передує останньому появі рядка, in
а потім горизонтальним пробілом , ви можете використовувати:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
Там позитивне заперечне твердження нульової ширини містить негативне твердження вперед-нульової ширини ( (?!
)
).
У !
з'являється таким чином, щоб бути важко уникнути елегантно; метод, який я використав для запобігання його запуску розширення історії оболонки перед передачею, grep
- тимчасово відключити розширення історії ( set +H
) перед запуском команди та повторно включити її ( set -H
) після цього. Якщо ви використовуєте це в сценарії, а ваш скрипт не містить set -H
, робити це не потрібно, оскільки розширення історії вмикається автоматично лише тоді, коли оболонка працює в інтерактивному режимі.
Нарешті, зауважте, що жоден із них, ані відповідь геемайла , насправді не визначають результат виведення grep
до cd
(хоча вихід pip
досі все ще виконується grep
). Замість труб , відповідним інструментом для цього завдання є підміна команд .