私が読んでBashで文字列を配列に分割する方法ところで、この質問は私とはちょっと違うようなので、私のデータを活用して質問してみましょう。
STDINには次の行があります。
(5,[a,b,c,d,e,f,g,h,i,j])
5つが私のグループIDで、文字は配列(グループデータ)の値です。グループIDをvarに入れ、文字を使用できる場所に入れる必要があります。IFS=',' read -r -a array <<< "$tline"
ベストアンサー1
bkpIFS="$IFS"
IFS=',()][' read -r -a array <<<"(5,[a,b,c,d,e,f,g,h,i,j])"
echo ${array[@]} ##Or printf "%s\n" ${array[@]}
5 a b c d e f g h i j
IFS="$bkpIFS"
説明する:
- まず、基本/現在をバックアップする必要があります。シェルIFSそして
bkpIFS="$IFS"
; 次に、IFSを区切り文字セット、、、、
,
に設定します。これは、入力文字列を1つ以上の区切り文字で区切ることができることを意味します。(
)
]
[
IFS=',()]['
次に、行を読み込み、上記で定義したIFSに基づいて着信入力文字列から呼び出される
read -r -a array
配列に分割します。array
ここにある文字列方法。このオプションは、入力時にバックスラッシュを拡張しないように-r
コマンドに指示します。read
\
IFS=',()][' read -a array <<<"(5,[a,b,c,d,e,f,g,h,i,j,\,k])" echo ${array[@]} 5 a b c d e f g h i j ,k
終わりを見なさい
,k
これは、オプションread
なしで入力にバックスラッシュがあるために-r
発生します。echo ${array[@]}
配列のすべての要素を印刷しています。バラより$*と$@の違いは何ですか?そしてザイルズの答え${array[@]}
そこの詳細があります。printf "%s\n" ${array[@]}
配列要素を印刷する他の方法があります。printf "%s\n" ${array[INDEX]}
これで、配列内の特定の要素を使用または印刷できますecho ${array[INDEX]}
。IFS
ああ、申し訳ありません。シェルにもう一度報告するのを忘れました。IFS="$bkpIFS"
:)
またはawk
そのsplit
機能を使用してください。
awk '{split($0,arr,/[][,)(]/)}
END{for (x in arr) printf ("%s ",arr[x]);printf "\n"}' <<<"(5,[a,b,c,d,e,f,g,h,i,j])"
説明する:
[...]
繰り返しますが、using関数/[...]/
の最新の実装でサポートされている正規表現定数で定義されている区切り文字グループに基づいて入力行全体を分割します。awk
split
もっと読む機能セクションでsplit()
。次に
END{for (x in arr) printf ("%s ",arr[x]); ...}
、配列を繰り返してarr
その値を印刷します。x
これは以下を指します。索引配列arr
要素。詳しくはこちらawk
BEGIN/END ルール。
次にサイドリダイレクトBashで配列に要素を追加/削除する方法は?。