Shell 空白を含むテキストを詳細にトラバースする方法
シェルによるファイルのトラバース
例えば、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
概要
今回の記事は、シェルでスペースを含むテキストを反復処理する方法についてです。シェルでスペースを含むテキストを反復処理する方法については、スクリプトハウスの過去の記事を検索するか、以下の関連記事を引き続き参照してください。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン