文字列を読み取って特定の区切り記号で分割したい場合は、文字IFS
列スライスを設定して配列に格納できます。次に、そのアイテムでやりたいことを何でもできます。
while IFS=_ read -r -a myarray; do
printf "%s -\n" "${myarray[@]}"
done <<< "a_b"
これは以下を返します:
$ while IFS=_ read -r -a myarray; do echo "hello"; printf "%s -\n" "${myarray[@]}"; done <<< "a_b"
hello
a -
b -
ただし、ループごとにこれらのフィールドの 1 つだけを読み取りたい場合があります。while
したがって、このループに毎回スライスを供給する方法があるのではないかと思います。つまり、最初の反復ではread
get just a
、2回目の反復では get just というb
ようになります。
ループにフィードする方法を変更する方法を見つけました。代わり<<< "a_b"
に、すべてを次の新しい行にtr
置き換えることで、これを分割していました。_
< <(tr "_" "\n" <<<"a_b")
$ while IFS=_ read -r -a myarray; do echo "hello"; printf "%s -\n" "${myarray[@]}"; done < <(tr "_" "\n" <<<"a_b")
hello
a -
hello
b -
しかし、私は疑問に思います:これには他の方法がありますか? フィールドセパレーターを変更する必要があるため、Bash には、たとえばIFS
「レコードセパレーター」を設定するための他の変数がありますか?awk