半角空白を含む要素の繰り返し処理【シェルスクリプト】
- 最終更新:
- 公開日:
for文で半角空白を含む要素を繰り替えし処理したいという場合でも、要素をそのまま書けるのであれば、それほど問題はないことが多いでしょう。
#そのまま要素を書く場合
for VAR in 'トマト とまと' 'リンゴ りんご' 'ブドウ ぶどう'
do
echo "${VAR}"
done
直接書くなら、シングルクウォート等で囲んで書けば良いだけです。
ただ、in以下を変数等で与える場合に、いまいちうまくいきません。
そこで、力技っぽいですが、対処法を考えたものメモしておきます。
もっとスマートな方法があれば、そちらで良いと思います。
要素の半角空白を置き換えてforで処理
見出しの通り、要素の半角空白を一旦別の文字に置き換えて、forで処理します。
臨時で置き換える文字は、そのときに都合の良いものを選ぶと良いです。
半角空白を含む文字列を行ごとに読み込んで、それを出力させて確認してみます。
STR='北海道 札幌
岩手 盛岡
宮城 仙台'
STR=`echo "${STR}" | sed -e "s/ /+/"`
for VAR in ${STR}
do
VAR=`echo "${VAR}" | sed -e "s/+/ /"`
echo "${VAR}"
done
上の例では、半角空白をsedコマンドでプラス記号に置き換えて、forで読み込み、再びsedコマンドで戻してから出力しています。
区切り文字を変更してforで処理
下の例では、デリミタ(区切り文字)の環境変数であるIFSに変更を加えて、改行ごとで読み込んでいきます。
STR='いぬ 犬
ねこ 猫
うさぎ 兎'
OIFS=${IFS}
IFS='
'
for VAR in ${STR}
do
echo "${VAR}"
done
IFS=${OIFS}
上の例では、最初に従来のIFSの設定をOIFSにコピーしておき、一旦「改行」をデリミタに設定して、最後に元の設定に戻しています。
「while read」で行ごとの処理を繰り返す
「while read」を使えば、行ごとに読み込んで、繰り返し処理を行うことができます。
行に半角空白が含まれていても関係ないので、for文で処理しにくい場合に利用を考えてみてもよいかもしれません。
注意点としては、「while read」の外部で定義した変数について、それを変更しようとする場合、パイプで与えようとしてもうまくいきません。
下記のような形で、読み込ませる内容を与えると上手くいきます。
STR='<h2>うさぎ かめ</h2>
<h2>金の斧 銀の斧</h2>
<h2>北風 太陽</h2>'
TXT=''
while read LINE
do
TXT="${TXT}
${LINE}"
done < <(echo "${STR}" | sed -n "s|<h2>\(.*\)</h2>|\1|p")
echo "${TXT}" | sed -e /^$/d
上の例では、h2タグで囲まれた文字列を取得して、それらを変数TXTに格納していき、最後に、空白行を削除して内容を確認しています。