Bash で区切り文字で文字列を分割するにはどうすればいいですか? 質問する

Bash で区切り文字で文字列を分割するにはどうすればいいですか? 質問する

この文字列を変数に保存します:

IN="[email protected];[email protected]"

ここで、文字列を;区切り文字で分割して、次のようになります。

ADDR1="[email protected]"
ADDR2="[email protected]"

ADDR1および変数は必ずしも必要ではありませんADDR2。それらが配列の要素であれば、さらに良いでしょう。


以下の回答からの提案を受けて、私が求めていたのは次のものになりました。

#!/usr/bin/env bash

IN="[email protected];[email protected]"

mails=$(echo $IN | tr ";" "\n")

for addr in $mails
do
    echo "> [$addr]"
done

出力:

> [[email protected]]
> [[email protected]]

解決策としては、内部フィールドセパレータ(IFS) に;。その回答で何が起こったのかわかりません。IFSデフォルトに戻すにはどうすればよいですか?

RE:IFS解決策、これを試してみたところ、うまくいきました。古いものを保持してIFS、それを復元します。

IN="[email protected];[email protected]"

OIFS=$IFS
IFS=';'
mails2=$IN
for x in $mails2
do
    echo "> [$x]"
done

IFS=$OIFS

ちなみに、私が試したとき

mails2=($IN)

ループで印刷すると最初の文字列のみが取得され、括弧なしでも$IN機能します。

ベストアンサー1

設定できるのは内部フィールドセパレータ(IFS) 変数を解析して配列に格納します。コマンド内でこの処理が行われると、IFSそのコマンドの環境 ( read) への割り当てのみが行われます。次に、変数値に従って入力を解析してIFS配列に格納し、これを反復処理します。

この例では、 で区切られた 1 行の項目を解析し;、配列にプッシュします。

IFS=';' read -ra ADDR <<< "$IN"
for i in "${ADDR[@]}"; do
  # process "$i"
done

この他の例は、 のコンテンツ全体を処理するためのもので$IN、入力の 1 行が で区切られるたびに;

while IFS=';' read -ra ADDR; do
  for i in "${ADDR[@]}"; do
    # process "$i"
  done
done <<< "$IN"

おすすめ記事