목록 또는 숫자 범위로 지정된 사용자 입력을 읽고 구문 분석하는 방법

목록 또는 숫자 범위로 지정된 사용자 입력을 읽고 구문 분석하는 방법

각 개별 번호를 인쇄할 수 있도록 사용자가 다음 형식으로 숫자를 입력할 수 있도록 하는 가장 간단한 방법은 무엇입니까?

쉼표 구분(1,5,7), 공백 구분(1 5 7) 및 범위 구분(1-3,5)

Expected output if input is comma separated: 
1
5
7
Expected output if input is space separated: 
1
5
7
Expected output if input is - and , separated:
1
2
3
5

나는 다음을 시도했습니다. 논리를 정의하십시오.

input_string="1,5,7"
IFS=' ' read -r -a array <<< "$input_string"
echo ${array[1]} etc..

input_string="1 5 7"
 read -r -a array <<< "$input_string"
echo ${array[1]} etc..

처리 방법이 궁금합니다. 둘 다 배열로 함께 사용하면 됩니다. 감사합니다.

답변1

먼저 쉼표/공백으로 분할하고 결과를 반복한 다음 대시로 분할하여 범위의 시작과 끝을 가져옵니다.

$ cat ranges.sh
#!/bin/bash    
IFS=', ' read -a ranges <<< "$*"
for range in "${ranges[@]}"; do
        IFS=- read start end <<< "$range"
        [ -z "$start" ] && continue
        [ -z "$end" ] && end=$start
        for (( i=start ; i <= end ; i++ )); do
                echo "$i"
        done
done
$ bash ranges.sh 1-3,5 9-10
1       
2               
3       
5
9
10

이는 더 나은 온전성 검사 등을 통해 달성될 수 있습니다.

답변2

또한 시도

T="$@"
echo {1..100} | { cut -d" " -f"${T// /,}"; }

답변3

awk 변형을 생각해 냈습니다.

awk -v RS='[[:blank:]]|[\n]|[,]' '{max=a[split($0, a ,"-")]; if(max!=0){while(a[1]<=max){print a[1]++}}}' /tmp/a.txt

구분된 입력을 레코드로 읽고 "-"를 사용하여 배열로 분할합니다. "-"가 없는 레코드는 첫 번째 인덱스와 마지막 인쇄 값에 저장됩니다.

입력하다:

1-3,5 6

산출:

1
2
3
5
6

관련 정보