콘솔에 입력된 옵션을 통해 표준 입력에서 선택한 항목을 선택합니다.

콘솔에 입력된 옵션을 통해 표준 입력에서 선택한 항목을 선택합니다.

아래 설명된 대로 작동하는 "선택" 필터 스크립트를 알려줄 수 있는 사람이 있나요?

나는 값 목록을 파이프로 연결하고 콘솔에서 선택한 항목에 따라 그 하위 집합을 내보낼 수 있는 간단한 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,MN부터 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. 물론 이는 덜 효율적입니다.

이 스크립트는 당신이암소 비슷한 일종의 영양 catsed이 설치되었습니다. BSD 도구를 사용하는 경우 명령 플래그가 달라집니다.

관련 정보