표준 출력의 N번째 줄 번호에 접근할 수 있나요?

표준 출력의 N번째 줄 번호에 접근할 수 있나요?

파일 목록을 출력하는 스크립트를 고려해보세요.

$> bash someScript.sh
path/to/some/file
path/to/the/file/i/want/to/work/with
path/to/yet/another/file

이제 두 번째 파일 경로를 다른 명령에 인수로 전달하고 싶습니다 vim. 직접 액세스할 수 있는 방법이 있습니까?

반드시 두 번째 파일에 접근할 필요는 없지만 다음번에는 세 번째나 27번째 파일에 접근할 수도 있다는 점을 지적하고 싶습니다. 가능한 한 쉽게 N행을 선택할 수 있기를 원합니다.

이제 마우스 선택을 사용하고 중간 클릭으로 삽입하거나 탭 완성을 사용하여 경로를 입력합니다. 이제 더 쉬운 방법이 있는지 궁금합니다.

내 솔루션의 문제점은 모든 스크립트를 이런 방식으로 편집해야 한다는 것입니다. 어떤 종류의 명령 find이라도 사용할 수 있는 이 문제에 대한 보다 일반적인 해결책이 있다면 흥미로울 것입니다.

답변1

틀림없이.

bash someScript.sh | sed -n '2 p'

출력을 필터링하고 두 번째 줄만 인쇄합니다. 다음 매개변수로 만듭니다 vim.

vim "$(bash someScript.sh | sed -n '2 p')"

답변2

예를 들어 출력의 두 번째 줄에 액세스하려면 head와 tail을 사용하십시오.

bash someScript.sh | head -2 | tail -1

답변3

짧은 입력이 가장 중요하고 파일이 그다지 크지 않은 경우:

nth_line=$(sed -n ${n}p)
nth_line=$(sed $n\!d)

파일이 길고 한 줄에만 관심이 있는 경우 sed필요한 줄을 인쇄하고 종료하거나 tail이전 줄을 삭제하고 head결과의 첫 번째 줄을 추출합니다.

nth_line=$(sed -n -e "$n {" -e p -e q -e "}")
nth_line=$(tail -n +$n | head -n 1)

( tail -n +$n라인 n-1은 건너뛰었습니다. 즉, 출력은 라인 n에서 시작됩니다.)

적은 수의 라인의 경우 read내장된 라인을 사용할 수 있습니다.

IFS= read -r first_line; IFS= read -r second_line

모든 줄을 읽으려면 배열(ksh/bash/zsh에만 해당)에 넣을 수 있습니다.

IFS=$'\n'
lines=($(cat))
second_file="${lines[1]}"  # note that ksh/bash arrays start at 0

이 코드를 재사용 가능하게 만들려면 함수에 넣으세요.

# Read at most MAX input lines (default: all) into the VAR array (default: ${lines[@]}).
# Usage: read_lines [VAR [MAX]]
read_lines () {
  typeset IFS=$'\n'
  if [ $# -eq 0 ]; then set lines; fi
  if [ -z "$2" ]; then eval "$1=(\$(cat))"; else eval "$1=(\$(head -n $2))"; fi
}

답변4

약간의 해킹이긴 하지만 해결했습니다. ;)

파일 경로를 출력하는 스크립트는 다음과 같습니다.

#!/bin/bash
rm /tmp/svn_filelist_to_source /tmp/svn_filelist
svn status | egrep 'M |A ' | cut -c9- > /tmp/svn_filelist
counter=1
cat /tmp/svn_filelist | while read -r path; do
  echo $path
  echo "file$counter=\"$path\"" >> /tmp/svn_filelist_to_source
  counter=$(($counter+1))
done;

이것이 내가 실행하는 방법입니다. 별칭에 넣은 것 같습니다.

sh statusAddedAndModified.sh && source /tmp/svn_filelist_to_source

이제 다음을 수행할 수 있습니다.

svn commit $file2

관련 정보