이것은 출력입니다.
3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, h.264, 1029.1, 31, 31, 0,0,0.000000,31,31,0,0,0.000000,7,0,0,0.000000,30,1280 720,10,0,0,0.000000,30,1280 720
나는 두 가지 시나리오로 시도했다.
-
배열에 저장
@arr=split(',',$stats); echo "statistics: $stats"
-
변수에 저장
echo $stats | cut -d ',' -f | read s1 echo $s1
그러나 두 시나리오 모두 작동하지 않습니다.
답변
한 줄의 입력에 다음과 같은 것을 사용할 수 있습니다.
IFS="," read -ra arr <<< "$foo"
데모:
$ cat t.sh
foo="3,aac-lc, 93.8, aaclc, 77.3, h.264, 1024.6, ..." # snipped
IFS="," read -ra arr <<< "$foo"
echo ${#arr[@]}
echo ${arr[0]}
echo ${arr[30]}
$ ./t.sh
31
3
1280 720
크레딧 : bash의 구분 기호를 기반으로 분할 문자열? Johannes Schaub의 답변 입니다. 다른 답변도 확인하십시오.
답변
첫 번째 스 니펫은 셸 구문과 다릅니다. 올바른 Perl 구문입니다.
두 번째 스 니펫이 cut
올바르게 사용되지 않습니다 . 당신이 의도 한 바를 모르겠습니다.
셸에는 내장 문자열 분리 구문이 있습니다. $somevar
따옴표없이 쓰면 셸은 먼저 변수 값을 somevar
찾은 다음 해당 값을로 지정된 문자에서 별도의 단어로 분할하고 IFS
각 단어를 glob로 해석합니다. 패턴 (파일 와일드 카드). 따라서 IFS
구분 문자 로 설정 하고 글 로빙을 일시적으로 해제 하여 문자열을 분할 할 수 있습니다 .
set -f; IFS=,
arr=($stats)
set +f; unset IFS
필드에 공백이 포함되어 있으면 배열 요소는 해당 공백을 유지합니다. 쉼표뿐만 아니라 모든 공백을 나누려면을 설정하십시오 IFS=', '
. 주 IFS
에서 분할하지만,에서 분할에 문자 집합에 문자열이 아닌; 공백이나 쉼표는 구분 기호를 구성합니다. 또한 공백에는 특별한 규칙이 있습니다. 0 개 이상의 공백 시퀀스, 쉼표, 0 개 이상의 공백 시퀀스는 하나의 구분 기호를 구성하고 하나 이상의 공백 시퀀스도 구분 기호를 구성합니다.
필드의 시작 또는 끝 부분에서 공백 만 제거하려면 요소별로 공백을 제거해야합니다.
shopt -s extglob
for ((i=0; i<${#arr[@]}; i++)); do
arr[i]=${arr[i]#+( )} # strip one or more spaces at the beginning
arr[i]=${arr[i]%+( )} # strip one or more spaces at the end
done
답변
$ set -f # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc