1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

Shell 空白を含むテキストを詳細にトラバースする方法

2022-01-05 02:32:16

シェルによるファイルのトラバース

例えば、1ファイルあたりの行数を数えるなど、あるフォルダ以下のすべてのファイルに対して同じことをしたい場合があるので、ファイル・トラバーサルを使うと簡単です。

$ for i in `ls`;do wc -l $i;done
55552 f123.txt
55819 f124.txt
56118 f125.txt
56404 f126.txt
56633 f127.txt
56842 f128.txt

ここでは、for... .do...done ループです。ループ文は、行の先頭で書くと ; で区切られることに注意してください。

ls はバッククォートで展開する必要があります。

シェルがスペーステキストをトラバースする

スペースや特殊文字を含むファイルの扱いは、Linuxを使う人ならマスターしておくべきことです。今回は、スペースを含むファイルに対してforループを使用する方法について説明します。

テストテキストは以下の通りです。

この行にはスペースがあります
これらの
する
ではなく

ここで、このテキストを繰り返し処理するためにforループを使用します。forループを実行すると、シェルは最初の行にあるスペースを見て、各行が異なる反復処理であると判断します。

[root@test ~]# for i in $(cat test);do echo $i;done
This
line
has
spaces
these
do
not


IFSは、単語を区切る際にセパレータとして使用する文字または文字のセットを定義します。

ウィキペディア Unix オペレーティングシステムの多くのコマンドラインインタプリタ ("shells") にとって、内部フィールドセパレータ (略称 IFS) は、特定の操作でパターンをトークンに分割するために使用する文字を定義する変数を指します。

IFS(フィールドセパレーター)の値は、デフォルトでは <space><tab><newline> になっています。つまり、シェルは最初の行にスペースがあると、その行を4つのトークン(4つの単語)に分割するのです。

IFSの値をニーズに合わせて変更する

IFSは環境変数です。環境変数を変更する前に、その内容を保存しておくことは良い習慣です。そうすれば、簡単にデフォルトの値に設定することができます。

まず、IFS 変数の値を OLDIFS に保存するところから始めます。

OLDIFS=$IFS


IFSを手動で好きな値に設定することができます。この場合、フィールドセパレータを改行として使用する必要があります。IFSは他の変数と同じように設定することができます。

IFS=<our value>


IFSを改行に設定するには、echoコマンドから改行出力を得るためにコマンド置換を使用します。

IFS=`echo -e "\n"`


echo -e "\n" の出力は改行されます。シェルコマンドの出力を変数IFSとして扱うバッククオートラッピングに使用します。

さて、同じようにforループを実行すると、シェルはテキストを改行で区切ります。

[root@test ~]# for i in $(cat test); do echo $i; done
This line has spaces
these
do
not




Translated from 空白を含むファイルをループで処理する - Bash for Loop

概要

今回の記事は、シェルでスペースを含むテキストを反復処理する方法についてです。シェルでスペースを含むテキストを反復処理する方法については、スクリプトハウスの過去の記事を検索するか、以下の関連記事を引き続き参照してください。