
出力は次のとおりです。
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
私は2つのシナリオを試しました。
配列に保存
@arr=split(',',$stats); echo "statistics: $stats"
変数に保存
echo $stats | cut -d ',' -f | read s1 echo $s1
しかし、どちらの場合も機能しません。
答え1
1行入力の場合は、次のように使用できます。
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の区切り文字に基づいて文字列を分割しますか?回答者ヨハネス・シャウプ。他の答えも確認してください。
答え2
最初のスニペットはシェル構文とは全く異なります。これは正しいPerl構文です。
2番目のスニペットが誤って使用されましたcut
。意図が何なのかわかりません。
シェルには文字列分割構造が組み込まれています。$somevar
引用符なしで作成すると、シェルは最初に変数の値を見つけ、そのsomevar
値を指定された文字に基づいて別々の単語に分割し、IFS
最後にそれぞれを分割します。単語が解釈されます。 globパターン(ファイルワイルドカード)で。したがって、IFS
区切り文字を設定し、ワイルドカードを一時的にオフにして文字列を分割できます。
set -f; IFS=,
arr=($stats)
set +f; unset IFS
フィールドにスペースが含まれている場合、配列要素はそのスペースを保持します。スペースとカンマの両方を区切るには、設定してくださいIFS=', '
。これはIFS
分割する文字列ではありませんが、分割する文字セットは区切り文字を構成します。また、空白に関する特別な規則があります。ゼロ個以上のスペース、カンマ、ゼロ個以上のスペースが区切り文字を構成し、1つ以上のスペースシーケンスも区切り文字を形成します。
フィールドの先頭または末尾からのみスペースを削除するには、要素ごとにこれを行う必要があります。
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
答え3
$ set -f # turn off globbing, so as not to expand wildcards
$ arr=($(echo "$stats" | sed 's/,/ /g'))
$ echo ${arr[1]}
aac-lc