Referenzieren Sie die vorherige Befehlsausgabe/den Inhalt des Terminalbildschirms in der aktuellen Befehlszeile

Referenzieren Sie die vorherige Befehlsausgabe/den Inhalt des Terminalbildschirms in der aktuellen Befehlszeile

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 | tacdiese 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

verwandte Informationen