
Ich muss in Bash häufig eine Ausgabezeile vollständig kopieren:
$ grep -ilr mysql_connect *
httpdocs/includes/config.php
httpdocs/admin/db.php
statistics/logs/error_log
$ vim httpdocs/includes/config.php
Gibt es eine Möglichkeit, eine Bash- oder Tmux-Verknüpfung dafür zu konfigurieren three lines up
, wie zum Beispiel @@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)
Die Verknüpfung muss nicht sein @@
, alles andere ist auch möglich. Idealerweise funktioniert dies in jeder Bash, aber eine tmux-Verknüpfung würde auch funktionieren.
Beachten Sie, dass ich mit tmux und dem Kopieren und Einfügen auf dem Bildschirm vertraut bin (Einfügemodus aufrufen, zum Kopieren wechseln, zurückkommen, einfügen), aber ich hoffe auf etwas, das ich einfacher verwenden kann (@@N), da ich dies anscheinend oft mache.
Antwort1
Die folgende Bash-Funktion verwendet die Ausgabe, die Sie nach dem Ausführen des Befehls erhalten (dh grep -ilr mysql_connect *
), um eine Liste zu erstellen, aus der Sie eine Option, eine Datei, auswählen können. Nach der Auswahl wird die Datei mit Vim geöffnet.
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
}
Voraussetzungen: Die Ausgabe muss durch „\n“ getrennt sein.
Verwendung: Ausgabeauswahl [Befehl]
Beispiel:
output_selection grep '.php$' foo.txt
Das ist nicht genau das, was Sie verlangt haben, also können Sie es als legitimen Vorschlag betrachten, dieselbe Aufgabe auf eine Weise auszuführen, die meiner Meinung nach bequemer ist – insbesondere, wenn die Ausgabe groß ist.
Antwort2
Vorausgesetzt, die Dateinamen enthalten keine Leerzeichen, wird Folgendes Ihr Anliegen erfüllen:
$ set -- $(grep -ilr mysql_connect * | tac)
$ echo $3
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $1
statistics/logs/error_log
Sie können weitere Funktionen erstellen, ohne | tac
diese in der richtigen Reihenfolge auszudrucken:
$ set -- $(grep -ilr mysql_connect *)
$ echo $1
httpdocs/includes/config.php
$ echo $2
httpdocs/admin/db.php
$ echo $3
statistics/logs/error_log