Hacer referencia a la salida del comando anterior/contenido de la pantalla del terminal en la línea de comando actual

Hacer referencia a la salida del comando anterior/contenido de la pantalla del terminal en la línea de comando actual

A menudo necesito copiar una línea de salida en Bash en su totalidad:

$ grep -ilr mysql_connect *
httpdocs/includes/config.php
httpdocs/admin/db.php
statistics/logs/error_log
$ vim httpdocs/includes/config.php

¿Hay alguna forma de configurar un acceso directo a Bash o Tmux para three lines up, como quizás @@3:

$ grep -ilr mysql_connect *
httpdocs/includes/config.php
httpdocs/admin/db.php
statistics/logs/error_log
$ vim @@3 # This would be the equivalent of vim httpdocs/includes/config.php (three lines up)

No es necesario que el atajo sea @@, cualquier otra cosa serviría. Idealmente, esto funcionaría en cualquier Bash, pero un atajo de tmux también funcionaría.

Tenga en cuenta que estoy familiarizado con tmux y copiar y pegar en pantalla (ingrese al modo pegar, mueva para copiar, regrese, pegue), pero espero algo que pueda usar más fácilmente (@@N), ya que parece que hago esto con frecuencia. .

Respuesta1

La siguiente función Bash utilizará el resultado que obtiene después de ejecutar el comando (es decir, grep -ilr mysql_connect *) para crear una lista de la cual puede seleccionar una opción, un archivo. Una vez realizada la selección, el archivo se abrirá usando Vim.

output_selection()
{
    local i=-1;
    local opts=()
    local s=

    while read -r line; do
        opts+=("$line")
        printf "[$((++i))] %s\n" "$line"
    done < <("$@")

    read -p '#?' s

    if [[ $s = *[!0-9]* ]]; then
        printf '%s\n' "'$s' is not numeric." >&2

    elif (( s < 0 )) || (( s >= ${#opts[@]} )); then
        printf '%s\n' "'$s' is out of bounds." >&2

    else
        vim "${opts[$s]}"
    fi
}

Condiciones previas: La salida debe estar delimitada por '\n'.

Uso: selección_salida [comando]

Ejemplo:

output_selection grep '.php$' foo.txt

Esto no es exactamente lo que solicitó, por lo que puede verlo como una sugerencia legítima para realizar la misma tarea de una manera que, en mi opinión, sea más conveniente, especialmente cuando el resultado es grande.

Respuesta2

Suponiendo que los nombres de los archivos no contienen espacios, esto hará lo que solicitó:

$ set -- $(grep -ilr mysql_connect * | tac)
$ echo $3
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $1
statistics/logs/error_log

Puede crear otra función sin | tacimprimirla en el orden correcto:

$ set -- $(grep -ilr mysql_connect *)
$ echo $1
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $3
statistics/logs/error_log

información relacionada