Dependiendo de lo que haga y no sepa de antemano acerca de lo que se pip
generará, es posible que decida grep
algo diferente /usr.*
.
Si sabe que el directorio comienza con/usr
(y que aparece al final de la línea de salida de pip
, y que /usr
no aparece en ninguna parte de la línea antes del nombre del directorio), entonces es una buena elección; La respuesta de Heemayl te dice cómo.
Si la razón por la que sabe que comienza /usr
es porque acaba de ejecutar el comando y conoce el directorio al que desea cambiar, sugiero la solución más simple de ejecutar el comando cd /usr/lib64/python2.7/site-packages
. Esto es menos escribir incluso si no hace uso de la finalización de la pestaña .
De lo contrario, puede elegir una expresión regular diferente según lo que sepa sobre el resultado que se analiza. Todas las alternativas a continuación aún asumen que el nombre del directorio aparece al final de la línea, pero los otros supuestos varían.
Si sabe que el nombre del directorio es absoluto (es decir, comienza con a /
) y no /
aparece en la línea antes del nombre del directorio , puede usar la misma expresión regular que en la respuesta de heemayl pero con en /
lugar de /usr
:
cd "$(pip install django | grep -o '/.*')"
Esto coincide con un /
seguido de cero o más ( *
) de cualquier carácter ( .
).
Si sabe que el nombre del directorio no contiene espacios en blanco horizontales (sin espacios ni pestañas) y aparece al final de la línea , puede usar:
cd "$(pip install django | grep -oP '[^\h]+$')"
Aquí he usado un Perl regexp ( -P
) porque la \h
abreviatura (for [:blank:]
) hace que sea más fácil escribir y leer que un regexp extendido equivalente ( -E
). Esto coincide con uno o más ( +
) de cualquier carácter en una clase de caracteres ( [
]
) que no sea ( ^
) un espacio o tabulación ( \h
).
Si sabe que el nombre del directorio está inmediatamente precedido por in
un espacio en blanco horizontal (es decir, rellenado con espacios en blanco a la izquierda y a la derecha), y que esta es la única ocurrencia in
en la línea , puede usar:
cd "$(pip install django | grep -oP '\hin\h+\K.+')"
Esto utiliza una aserción positiva de ancho cero ( \K
) para que coincida con uno o más caracteres ( .+
) que aparecen después de un espacio o tabulación ( \h
) in
, y otro uno o más espacios o tabulaciones ( \h+
), sin incluir realmente in
los espacios en blanco rodeándolo en el partido. Las afirmaciones de mirar alrededor son una característica de las expresiones regulares de Perl.
El patrón también habría funcionado, pero solo necesitamos buscar un espacio en blanco antes , independientemente de cuántos estén presentes. Por el contrario, debemos hacer coincidir todos los espacios en blanco después , de lo contrario, no se descartarían y coincidirían como parte del nombre del directorio.\h+in\h+\K.+
in
in
\K
Si sabe que el nombre del directorio está precedido inmediatamente por la última aparición de la línea in
seguida de espacios en blanco horizontales , puede usar:
set +H
cd "$(pip install django | grep -oP '\hin\h+(?!.*\hin\h.*)\K.*')"
set -H
Allí, la afirmación de retrospectiva positiva de ancho cero en sí misma contiene una aserción de anticipación negativa de ancho cero ( (?!
)
).
El !
aparece de tal manera que es difícil escapar con elegancia; el método que he usado para evitar que active la expansión del historial de shell antes de pasar grep
es deshabilitar temporalmente la expansión del historial ( set +H
) antes de ejecutar el comando y volver a habilitarlo ( set -H
) después. Si está usando esto en un script y su script no contiene set -H
, no necesita hacer esto ya que la expansión del historial se habilita automáticamente solo cuando un shell se ejecuta de forma interactiva.
Finalmente, tenga en cuenta que ninguno de estos, ni la respuesta de heemayl , en realidad están canalizando la salida de grep
a cd
(aunque la salida de pip
todavía se está canalizando a grep
). En lugar de tuberías , la herramienta adecuada para este trabajo es la sustitución de comandos .
` and
'', y tiene comillas simples alrededor de la expresión grep.!
allí no se cita con'
-quotes, ya que los'
-quotes se citan ellos mismos. La complejidad del comando hace que sea fácil predecir mal su efecto, pero aparentemente debido al orden de las expansiones (!
es temprano) termina funcionando comox=foo; echo "'$x'"
(->'foo'
). La eliminación de las"
comillas externas provocaría!
una'
comilla y evitaría la expansión del historial, pero luegocd
fallaría si el directorio tiene espacios en blanco en su nombre.