터미널 출력에서 ​​특정 라인 가져오기

터미널 출력에서 ​​특정 라인 가져오기

"수정이 필요한데 file-i-must-edit-2어디에 있는지 기억이 나지 않습니다."

locate file-i-must-edit
/home/user/file-i-must-edit-1
/home/user/file-i-must-edit-2
/home/user/file-i-must-edit-3

"좋아요! 다시 입력하는 것을 피할 수 있는 방법이 있었으면 좋겠어요 /home/user/file-i-must-edit-2..."

nano /home/user/file-i-must-edit-2 이런 식으로 입력하면 입력을 피할 수 있는 방법이 있나요 nano <output line 2>?

답변1

한 줄의 출력만 얻는다면 간단합니다.

locate file-i-must-edit
nano $(!!)

더 많은 줄이 있을 때 사용할 수 있는 기술이 있지만 원래 명령을 다른 방식으로 실행하는 것이 포함됩니다(항상 실행하고 싶지는 않을 것입니다).

$ touch a b c
$ OUT=( $(find .) )
$ echo ${OUT[2]}
./b

입력을 피하기 위해 할 수 있는 한 가지 방법은 이전 명령을 반복하고(물론 readline을 사용하여) 범위를 좁혀 한 줄만 얻은 다음 실행 nano $(!!)하거나 xargs.

답변2

이는 프로그래밍 방식의 접근 방식입니다(X-Windows 선택에 마우스를 사용하는 것과 비교).

# function to nano edit a line (by number) from $list

nano-n() { nano "$(sed -n "$1{p;q}" <<<"$list")"; }

# As you produce your list of files, save them to a variable ($list), 
#   as well as printng them to the terminal.
# Do this by "duplicating" descriptor 1 (stdout) to 
#  another available descriptor (eg. 9)

exec 9>&1; list="$(locate file-i-must-edit |tee /dev/fd/9)"

# now you can just type the following at the propmt (assuming that $list is available at the prompt)  

nano-n 2

관련 정보