web-dev-qa-db-ja.com

BASHの文字に対して文字列を分割するにはどうすればよいですか?

各セグメントを個別に操作できるように、認証コードを-文字で分割できるようにしたいと思います。外部バイナリ(awkgrep)を使用したくありません。これは、可能な限り最小限に抑えるためです。これを達成する方法は何ですか?

以下は認証コードの例です:

82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb

7
Jay Hellwig

Internal Field SeparatorIFS)を使用してみてください:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'

OIFS=$IFS                   # store old IFS in buffer
IFS='-'                     # set IFS to '-'

for i in ${AUTH_CODE[@]}    # traverse through elements
do
  echo $i
done

IFS=$OIFS                   # reset IFS to default (whitespace)

出力:

82a8
bd7d
986d
9dc9
41f5
fc02
2c20
3175
097a
c1eb

内部フィールド区切り文字を設定することにより、AUTH_CODE-文字。foreachループで新しく作成された要素をトラバースできます。

15
Daniel Li

IFSを使用できますが、これはより簡単です。

echo "82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb"- \
  | while read -d - i; do echo "$i"; done

分割する文字列の後に-が追加されていることに注意してください。そうでない場合、読み取りは最後のトークンを無視します。

5
Tometzky

パターンマッチングと配列の別の方法:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'
array=( ${AUTH_CODE//-/ } )
for j in ${array[@]} ; do echo $j ; done
4
ott--

パラメータ拡張を使用するだけです:

AUTH_CODE='82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'
echo "${AUTH_CODE//-/$'\n'}"

出力:

82a8
bd7d
986d
9dc9
41f5
fc02
2c20
3175
097a
c1eb
2
Thor
for i in {1..10}; do echo '82a8-bd7d-986d-9dc9-41f5-fc02-2c20-3175-097a-c1eb'|cut -d"-" -f$i;done
0
Tom