
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 | tac
imprimirla 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