スペースが含まれる文字列を1行として扱う方法 †一行単位でデータを扱いたいが、シェルの区切り文字がスペースになっていて変更できないかなぁ?と思っている方は、本記事が役に立つと思います。 以下のようなデータファイルがあり、スペース区切りで1行に3つの項目が格納されているファイルを利用して説明します。 $ cat data.txt Fedora Debian Ubuntu Vine Plamo CentOS openSUSE KNOPPIX Slackware スペース区切りになっている為、項目毎の表示となる †シェルの区切り文字を変更しないと以下のように、項目毎表示されてしまいます。 #!/bin/bash i=0 for L in `cat data.txt` do i=`expr $i + 1` echo $i : $L done
本当は3行として出力を期待しているのだが、区切り文字がスペース(改行含む)のため、9項目として処理されてしまう。 IFSを変更して区切り文字を改行だけにする †IFS(Internal Field Separator )に区切り文字を設定することにより解決できます。 #!/bin/bash IFS_BACKUP=$IFS IFS=$'\n' i=0 for L in `cat data.txt` do i=`expr $i + 1` echo $i : $L done IFS=$IFS_BACKUP 上記のIFS_BACKUPに変更前の区切り文字設定をバックアップしIFS環境変数を改行のみ指定します。
$'\n'以外の書き方 †以下の2つは同じ意味になります。 IFS=$'\n' IFS =' ' 上記は直接改行を入力した状態です。 #!/bin/bash IFS_BACKUP=$IFS IFS=' ' i=0 for L in `cat data.txt` do i=`expr $i + 1` echo $i : $L done IFS=$IFS_BACKUP 改行区切り文字と他の区切り文字の混在 †以下のテストデータを利用し改行の他に他の区切り文字も設定してみます。 $ cat data2.txt Fedora,Debian,Ubuntu Vine#Plamo#CentOS openSUSE&KNOPPIX&Slackware 区切り文字を、改行、#、, 、&の4つとした場合は以下のIFS設定になります。 #!/bin/bash IFS_BACKUP=$IFS IFS=' ,&#' i=0 for L in `cat data2.txt` do i=`expr $i + 1` echo $i : $L done IFS=$IFS_BACKUP
1行に複数の項目がある場合、IFSの変更により区切り文字を変更することができるため、データの扱いが便利になります。 |