아래 설명된 대로 작동하는 "선택" 필터 스크립트를 알려줄 수 있는 사람이 있나요?
나는 값 목록을 파이프로 연결하고 콘솔에서 선택한 항목에 따라 그 하위 집합을 내보낼 수 있는 간단한 bash 스크립트/필터를 찾는 데 약 한 시간을 보냈습니다. C로 작성된 예제가 있다는 것을 알고 있지만 Cygwin/Gitbash 등에서 사용할 수 있는 대부분의 이식 가능한 bash 스크립트를 원합니다. (컨텍스트: 특정 하위 디렉터리에서 특정 명령을 실행할 수 있기를 원하며 명령을 실행하려는 디렉터리의 선택을 실행하려는 명령에 의해 선택된 디렉터리로 분리하고 싶습니다. .)
가상의 사용 예를 들면 다음과 같습니다.
$ echo "foo
> bar
> baz" | pick.sh
* Options:
* 1. foo
* 2. bar
* 3. baz
* Choices? 2 3
bar
baz
*로 표시된 줄은 스크립트를 통해 대화식으로 "선택"할 요소를 선택할 수 있는 곳으로, 2번과 3번 줄을 결정하면 STDOUT으로 보냅니다.
이상적으로 선택은 공백으로 구분된 숫자(예: 2 3 4)와 포함 범위(예: 2-4)의 조합입니다. 아니면 항목 자체의 처음 몇 글자를 입력할 수 있는 일종의 자동 완성 기능을 사용할 만큼 멋진 것일 수도 있습니다.
글쎄요, 그게 전부입니다. 전반적으로 이것이 매우 유용한 bash 파이프 필터가 될 것이라고 생각합니다!
(지금까지 읽어주셔서 감사합니다..)
답변1
sed
행 지정자 ( N,M
N부터 M까지의 행을 의미)를 사용한 자체 시연 예 :
$ ./pick.sh < ./pick.sh
Lines:
1 #!/usr/bin/env bash
2
3 set -o errexit -o nounset -o noclobber
4
5 trap 'rm --force --recursive "$working_directory"' EXIT
6 working_directory="$(mktemp --directory)"
7 input_file="${working_directory}/input.txt"
8
9 cat > "$input_file"
10
11 echo 'Lines:'
12 cat --number "$input_file"
13
14 IFS=' ' read -p 'Choices: ' input < /dev/tty
15 lines=($input)
16
17 sed --quiet "$(printf '%sp;' "${lines[@]}")" "$input_file"
Choices: 1 5,7 17
#!/usr/bin/env bash
trap 'rm --force --recursive "$working_directory"' EXIT
working_directory="$(mktemp --directory)"
input_file="${working_directory}/input.txt"
sed --quiet "$(printf '%sp;' "${lines[@]}")" "$input_file"
기본적으로 표준 입력을 임시 파일에 저장하고, 줄 번호와 함께 파일을 인쇄하고, 범위를 묻는 메시지를 표시하고, 입력 범위를 전달하여 sed
각 범위를 인쇄합니다.
이 방법의 한 가지 특이한 점은 지정한 순서가 아니라 파일에 나타나는 순서대로 줄이 인쇄된다는 것입니다.
…
Choices: 3 1
#!/usr/bin/env bash
set -o errexit -o nounset -o noclobber
입력 순서가 정말로 필요한 경우에는 이를 반복하는 것이 쉽지 않습니다 lines
. 물론 이는 덜 효율적입니다.
이 스크립트는 당신이암소 비슷한 일종의 영양 cat
등 sed
이 설치되었습니다. BSD 도구를 사용하는 경우 명령 플래그가 달라집니다.