파일 목록을 출력하는 스크립트를 고려해보세요.
$> 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