Залежно від того, що ви робите, і не знаєте заздалегідь про те, що 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.+inin\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). Замість труб , відповідним інструментом для цього завдання є підміна команд .