
Muitas vezes preciso copiar uma linha de saída no Bash por completo:
$ grep -ilr mysql_connect *
httpdocs/includes/config.php
httpdocs/admin/db.php
statistics/logs/error_log
$ vim httpdocs/includes/config.php
Existe alguma maneira de configurar um atalho Bash ou Tmux para three lines up
, como talvez @@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)
O atalho não precisa ser @@
, qualquer outra coisa serviria. Idealmente, isso funcionaria em qualquer Bash, mas um atalho do tmux também funcionaria.
Observe que estou familiarizado com tmux e copiar e colar na tela (entrar no modo colar, mover para copiar, voltar, colar), mas espero algo que possa usar mais facilmente (@@N), pois parece que faço isso com frequência .
Responder1
A função Bash a seguir usará a saída obtida após executar o comando (ou seja, grep -ilr mysql_connect *
) para criar uma lista da qual você pode selecionar uma opção, um arquivo. Após a seleção ser feita, o arquivo será aberto usando o 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
}
Pré-condições: A saída deve ser delimitada por '\n'.
Uso: seleção_saída [comando]
Exemplo:
output_selection grep '.php$' foo.txt
Isso não é exatamente o que você pediu, então você pode ver isso como uma sugestão legítima para executar a mesma tarefa de uma maneira que seja, IMO, mais conveniente - especialmente quando a saída é grande.
Responder2
Supondo que os nomes dos arquivos não contenham espaços, isso fará o que você pediu:
$ set -- $(grep -ilr mysql_connect * | tac)
$ echo $3
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $1
statistics/logs/error_log
Você pode criar outra função sem | tac
imprimi-la na ordem correta:
$ set -- $(grep -ilr mysql_connect *)
$ echo $1
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $3
statistics/logs/error_log