¿Cómo acceder al segundo argumento desde el último comando en la historia?

11

Estoy empezando a aprender algo de Regex, por lo tanto, uso este comando repetidamente:

grep pattern /usr/share/dict/american-english 

Solo cambia la parte con patrón, así que tengo que escribir la expresión larga " / usr / share / dict / american-english " una y otra vez.

Alguien hizo el comentario de que es posible expandir un argumento de un comando desde el historial de comandos escribiendo combinaciones de caracteres crípticos en lugar de la expresión completa. ¿Podrías decirme esas combinaciones de personajes crípticos?

Abdul Al Hazred
fuente
¿Se trata del segundo argumento o del último argumento?
mikeserv
en este mismo caso, el último argumento es el segundo, no hice esta distinción clara.
Abdul Al Hazred
En ese caso, la bash, dash, zsh, mksh, y kshconchas (por lo menos, que yo sepa) serán todos reconocer el $_parámetro especial última arg (algunos lo hacen sólo en modo interactivo, sin embargo) . Sólo se expande como una variable: grep somepattern filename; grep otherpattern "$_". Por lo general, puede ver su contenido en la salida de set.
mikeserv

Respuestas:

23

Puede usar <M-.>(o <Esc>.si su tecla Meta se está utilizando para otra cosa), es decir, Meta-punto (o <esc> punto), donde Meta suele ser la tecla Alt, para recuperar el último argumento del comando anterior. Entonces, primero escribirías

$ grep foo /usr/share/dict/american-english

Y luego, si quisieras buscar algo más, escribirías

$ grep bar

Después de escribir un espacio y luego Esc.(es decir, primero presionar la tecla de escape, y luego la tecla de punto):

$ grep bar /usr/share/dict/american-english

También puede usar cualquiera de los siguientes:

$ grep bar !:2
$ grep bar !$

Donde !:2y !$significa "segundo argumento" y "último argumento" respectivamente.

Perilla de la puerta
fuente
Esto es para bash y shells que usan readline usando enlaces emacs (por defecto): con editing-mode viset necesitas agregar un enlace para ~/.inputrcfor yank-last-argy para Zsh debes vincular insert-last-word...
jasonwryan
@jasonwryan, si es la última arg desea, a continuación, en cualquiera de (interactivo) zsh , bash, ksh, mksh, o dashconchas sólo puede utilizar $_. POSIXLY que la unión está ya configurado, sin embargo, que ESC _cuando set -o viestá vigente.
mikeserv
@mikeserv Gracias Mike, debo haberlo recuperado para que sea compatible ...
jasonwryan
@jasonwryan - no hay problema - este es el único truco de teclado de shell que conozco - apesta recordar / configurar todos esos atajos de tipo rápido. Si no le importa, ¿compatibilidad con qué? ¿Hay algún programa que use que lo haga de manera diferente? Ah, también puedo recordar ESC @letter para el _letterenlace de alias, pero solo porque todavía no puedo encontrar la manera de hacerlo funcionar con bsd editline.
mikeserv
@mikeserv Lo ato de esa manera para que sea igual sin importar si estoy usando Bash o Zsh (ambos en modo vi) o en una máquina con Bash en modo Emacs (es uno de los enlaces que realmente martillo).
jasonwryan 05 de
2

En general (con Bash) <Esc> N <Esc> .recuperará el enésimo argumento del comando anterior en la línea de comando actual (donde N está basado en 0).

Para el segundo argumento del último comando, sería:

<Esc> 1 <Esc> .

Si querías el tercer argumento, entonces

<Esc> 2 <Esc> .

... y así.

Como otros han mencionado, si desea el último argumento del comando anterior, hay un acceso directo específico para eso en solo:

<Esc> .

abonet
fuente