В зависимости от того, что вы делаете и не знаете заранее о том, что pip
будет выводиться, вы можете выбрать grep
что-то иное, чем /usr.*
.
Если вы знаете, что каталог начинается с/usr
(и что он появляется в конце строки выходных данных pip
и /usr
не отображается нигде в строке перед именем каталога), то это хороший выбор; Ответ Heemayl говорит вам, как.
Если причина вы знаете , что начинается с /usr
том , что вы просто запустить команду и знать директорию , которую вы хотите изменить, я предлагаю простое решение , выполнив команду cd /usr/lib64/python2.7/site-packages
. Это меньше печатать, даже если вы не используете завершение табуляции .
В противном случае вы можете выбрать другое регулярное выражение в зависимости от того, что вы знаете о анализируемом выводе. Все приведенные ниже альтернативы все еще предполагают, что имя каталога появляется в конце строки, но другие предположения различаются.
Если вы знаете, что имя каталога является абсолютным (т. Е. Начинается с a /
), и /
в строке перед именем каталога не отображается no , вы можете использовать то же регулярное выражение, что и в ответе heemayl, но /
вместо /usr
:
cd "$(pip install django | grep -o '/.*')"
Это соответствует /
нулю или более ( *
) любого символа ( .
).
Если вы знаете, что имя каталога не содержит горизонтальных пробелов (без пробелов и табуляции) и отображается в конце строки , вы можете использовать:
cd "$(pip install django | grep -oP '[^\h]+$')"
Здесь я использовал Perl regexp ( -P
), потому что \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
, вам не нужно этого делать, поскольку расширение истории включается автоматически, только когда оболочка работает в интерактивном режиме.
Наконец, обратите внимание, что ни один из них, ни ответ heemayl, на самом деле не передают вывод grep
to cd
(хотя вывод pip
все еще передается grep
). Вместо конвейеров подходящим инструментом для этой работы является подстановка команд .
` and
'`, и вы должны использовать одинарные кавычки вокруг выражения grep.!
нет'
кавычек, так как'
сами кавычки цитируются. Сложность команды позволяет легко ошибочно предсказать ее эффект, но, очевидно, из-за порядка расширений (!
рано) она в итоге работает какx=foo; echo "'$x'"
(->'foo'
). Удаление внешних"
кавычек приведет!
к тому, что они будут'
заключены в кавычки и предотвратит расширение истории, но затемcd
завершится неудачно, если в каталоге есть пробелы в имени.