1

文字列を読み取って特定の区切り記号で分割したい場合は、文字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したがって、このループに毎回スライスを供給する方法があるのではないかと思います。つまり、最初の反復ではreadget 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

4

0 に答える 0