
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