Dependendo do que você faz e não sabe de antemão o pip
que produzirá, você pode optar grep
por algo diferente /usr.*
.
Se você souber que o diretório começa com/usr
(e que ele aparece no final da linha de saída de pip
e que /usr
não aparece em nenhum lugar da linha antes do nome do diretório), é uma ótima opção; A resposta de heemayl diz como.
Se o motivo pelo qual você sabe que começa /usr
é que você acabou de executar o comando e conhecer o diretório para o qual deseja alterar, sugiro a solução mais simples de executar o comando cd /usr/lib64/python2.7/site-packages
. Isso é menos digitado, mesmo se você não usar o preenchimento de guias .
Caso contrário, você poderá escolher uma regexp diferente, dependendo do que sabe sobre a saída que está sendo analisada. Todas as alternativas abaixo ainda assumem que o nome do diretório aparece no final da linha, mas as outras suposições variam.
Se você sabe que o nome do diretório é absoluto (ou seja, começa com a /
) e não /
aparece na linha antes do nome do diretório , você pode usar o mesmo regexp que na resposta do heemayl, mas com em /
vez de /usr
:
cd "$(pip install django | grep -o '/.*')"
Corresponde a um /
seguido por zero ou mais ( *
) de qualquer caractere ( .
).
Se você sabe que o nome do diretório não contém espaços em branco horizontais (sem espaços ou tabulações) e aparece no final da linha , você pode usar:
cd "$(pip install django | grep -oP '[^\h]+$')"
Aqui eu usei um Perl regexp ( -P
) porque a \h
abreviação (for [:blank:]
) torna mais fácil digitar e ler do que um regexp estendido equivalente ( -E
). Isso corresponde a um ou mais ( +
) de qualquer caractere em uma classe de caracteres ( [
]
) que não seja ( ^
) um espaço ou tabulação ( \h
).
Se você souber que o nome do diretório é precedido imediatamente por um in
espaço em branco horizontal (ou seja, preenchido à esquerda e à direita com espaços em branco), e que essa é a única ocorrência dessa in
linha , você pode usar:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
Isso usa uma asserção de look-behind positiva de largura zero ( \K
) para corresponder a um ou mais caracteres ( .+
) que aparecem após um espaço ou tabulação ( \h
) in
e outro ou mais espaços ou tabulações ( \h+
), sem incluir in
e espaços em branco cercando-o na partida. As asserções gerais são um recurso das expressões regulares do Perl.
O padrão teria funcionado também, mas precisamos procurar apenas um espaço em branco antes , independentemente de quantos estejam presentes. Por outro lado, precisamos corresponder a todos os espaços em branco depois , ou eles não serão descartados e corresponderão como parte do nome do diretório.\h+in\h+\K.+
in
in
\K
Se você souber que o nome do diretório é precedido imediatamente pela última ocorrência da linha in
seguida por espaço em branco horizontal , você pode usar:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
Lá, a própria afirmação positiva de largura zero contém uma afirmação negativa de largura zero ( (?!
)
).
O !
aparece de maneira a ser difícil escapar com elegância; o método que eu usei para impedir que ele desencadeie a expansão do histórico do shell antes de ser transmitido grep
é desativar temporariamente a expansão do histórico ( set +H
) antes de executar o comando e reativá-lo ( set -H
) posteriormente. Se você estiver usando isso em um script e seu script não contiver set -H
, não será necessário fazer isso, pois a expansão do histórico será ativada automaticamente somente quando um shell for executado de forma interativa.
Por fim, observe que nada disso, nem a resposta de heemayl , estão na verdade canalizando a saída de grep
para cd
(embora a saída de pip
ainda esteja sendo canalizada grep
). Em vez de tubos , a ferramenta apropriada para este trabalho é a substituição de comandos .
` and
'' e você usa aspas simples na expressão grep.!
não é citado com'
-quotes, como'
eles são citados. A complexidade do comando facilita a previsão errada de seus efeitos, mas aparentemente devido à ordem das expansões (!
é precoce), ele acaba funcionando comox=foo; echo "'$x'"
(->'foo'
). A remoção das"
aspas externas faria com!
que fossem'
citadas e impedisse a expansão do histórico, mascd
falharia se o diretório tivesse espaços em branco em seu nome.