IFS変数と正規表現を使用したBash文字列の分割

IFS変数と正規表現を使用したBash文字列の分割

文字列を任意の文字に配列に分割しようとしています。いいえ文字と数字。これを行うために正規表現パターンをIFS変数に割り当てることはできますか?

私は次のことを試しました:

input="$1"

IFS="[^a-zA-Z]"
read -ra name_parts <<< "$input"

ただし、これにより文字列が「a」または「A」に分割されます。 「^」も認識しません。 この問題タイトルは似ているようですが、私が尋ねる質問とは関係がないようです。

答え1

IFSこのままでは使用できません。もちろんいいえ正規表現を使用してください。少なくとも構成文字(リテラル文字)は、IFSシェル内の単語を展開するときに単語を分割するために使用されます。例えば

IFS=: read -r v1 v2 <<<"foo:bar"

定義した内容はIFS="[^a-zA-Z]"文字通り文字(例えば、、、、、、)を受け入れ、入力文字列を分割するための区切り文字[として使用されます。これは明らかに予想されたものとは異なります。^a-zAZ]

答え2

IFS正規表現ではなく、文字の束(またはバイト)です。ただし、awkまたはsedを使用して正規表現に基づいて文字列を分割し、より単純な区切り文字を使用して印刷し、シェルのread

read -ra name_parts < <(awk -vFS='[^a-zA-Z]' -vOFS=' ' '{$1=$1; print}' <<< "$input")

または

read -ra name_parts < <(sed -e 's/[^a-zA-Z]/ /g' <<< "$input")

答え3

IFS変更するのではなく、入力文字列をマップしてから、デフォルトのIFSを使用して分割する方がよいでしょう。

read -ra name_parts <<<"$(printf '%s\n' "$input" | LC_ALL=C tr -cs 'a-zA-Z\n'  '[ *]')"

配列名_partsは、文字以外の場所でスライスされた文字列を保持します。

関連情報