現在のコマンドライン内の前のコマンド出力/ターミナル画面の内容を参照

現在のコマンドライン内の前のコマンド出力/ターミナル画面の内容を参照

Bashから出力行全体をコピーする必要があることがよくあります。

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

three lines up次のようにBashまたはTmuxショートカットを設定する方法はありますか@@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)

ショートカットは行く必要はなく、@@他のものでなければなりません。理想的にはすべてのBashで動作しますが、tmuxショートカットも機能します。

ちなみに私はtmuxと画面のコピーと貼り付け(貼り付けモードに入る、コピーに移動、戻り、貼り付け)に慣れていますが、やるようなのでもう少し使いやすいものがあればいいです(@@N)。これはたくさん。

答え1

次のBash機能は、grep -ilr mysql_connect *コマンドの実行後に得られた出力(つまり)を使用してオプション(ファイル)を選択できるリストを生成します。ファイルを選択すると、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
}

前提条件: 出力は「\n」で区切る必要があります。

使用法: 出力選択[コマンド]

例:

output_selection grep '.php$' foo.txt

これはまさにあなたが要求したものではないので、IMOでより便利な方法で同じことをすることが合理的な提案だと思うかもしれません。特に出力が大きい場合にはさらにそうです。

答え2

ファイル名にスペースが含まれていないと仮定すると、要件が満たされます。

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

| tac正しい順序で印刷しなくても他の機能を作成できます。

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

関連情報