현재 명령줄 내에서 이전 명령 출력/터미널 화면 내용 참조

현재 명령줄 내에서 이전 명령 출력/터미널 화면 내용 참조

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

관련 정보