Bashシェルスクリプトで文字列を分割(split)する方法いろいろ
はじめに
最近、Bash で特定の文字 ( あるいは文字列 ) で連結されている文字列を分割して配列に代入したい場合の方法について聞かれることがあったのでまとめました。
検証環境
大きく 2 つのケースを考えてみる
文字列の分割 ( split ) について、大きく 2 つのケースを考えてみます。
- 単一の文字で分割
- 複数の文字 ( 文字列 ) で分割
単一の文字で分割する方法
1.変数参照時に置換する
Bash では、スペースを区切り文字として取り扱います。
したがって、区切り文字をスペースに置換し、 (..)
で囲んで配列にします。
最も簡潔に実現できます ( 問題点については後述 ) 。
※ただし、この方法には問題があります。本来区切り文字でないスペースが含まれている場合、スペースで区切られてしまいます。
2.一時的に環境変数 IFS
を変更する
環境変数 IFS
( Internal Filed Separator ) には、「スペース」「タブ」「改行」 ( \t\n
)といった値が初期設定されています。これらが文字の区切りとして認識されます。
IFS
に区切り文字としたい値を設定することで、単語の区切りを任意に変更できます。
3.一時的に環境変数 IFS
を変更し、 read
で配列にロード
こちらは先の IFS
環境変数を一時的に書き換える方法の亜種です。
別解と思っていただければよいでしょう。
複数の文字 ( 文字列 ) で分割
こちらは先の 単一の文字で分割する方法 を応用することで簡単に実現できます。
以下の例は、 ,
カンマの代わりに abc
という 文字列 で連結された文字列を分割する例になります。
区切り文字列 を一時的に単一の文字 ( ここでは ,
) に変換し、あとは先程見てきたやり方を利用します。
ひとこと
もっと良い方法があれば、ぜひコメントください。
ディスカッション
コメント一覧
まだ、コメントがありません