Home Search
よく分からないので力技で頑張ってるメモ

半角空白を含む要素の繰り返し処理【シェルスクリプト】

  • 最終更新:
  • 公開日:

 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に格納していき、最後に、空白行を削除して内容を確認しています。

References

 参考文献は特にありません。

TOPへ移動