Linux の 101 試験対策: 正規表現を使用したテキスト・ファイルの検索

干し草の山のなかから小さな針を探し出す

正規表現を使用する方法、そして正規表現を使ってファイルシステム上のファイルの中身を検索する方法を学んでください。この記事の内容は、Linux® のシステム管理者として認定するための LPI 101 試験に備えるためにも、自ら活用するために学ぶ上でも役立ちます。

Ian Shields, Senior Programmer, IBM

Ian ShieldsIan Shields は、developerWorks Linux ゾーンの様々な Linux プロジェクトに関わっています。彼はノースキャロライナ州 Research Triangle Park にある IBM のシニア・プログラマーです。1973年にオーストラリアのキャンベラでシステム・エンジニアとして IBM に入社して以来、カナダのモントリオールやノースキャロライナ州 Research Triangle Park で、コミュニケーション・システムやパーベイシブ・コンピューティングに携わってきました。彼はいくつかの特許を保持しており、論文もいくつか発表しています。Australian National University にて純粋数学および哲学で学位を取得し、また North Carolina State University にてコンピューター・サイエンスで修士号と博士号を取得しています。Ian についての詳しい情報は developerWorks コミュニティーの Ian のプロフィールで調べてください。



2010年 2月 03日

この連載について

この連載は Linux システム管理タスクの学習に役立つだけでなく、LPIC-1 (Linux Professional Institute Certification レベル 1) 試験に備えるための教材にもなります。

連載の各記事についての説明とリンクについては、連載のロードマップを参照してください。現在進行中のこのロードマップは、LPIC-1 試験の最新の目標 (2009年4月) を反映しています。完成した記事はその都度ロードマップに追加されていきますが、当面は developerWorks の LPI 認定試験対策チュートリアルで同様の教材の以前のバージョンを調べてください。これらのバージョンは、2009年4月より前の LPIC-1 目標に対応しています。

概要

この記事では、正規表現を使用してテキスト・ファイルを検索するための基本的な Linux の手法を説明します。この記事で説明する内容は以下のとおりです。

  • 単純な正規表現を作成する方法
  • 正規表現を使用してファイルおよびファイルシステムを検索する方法
  • sed で正規表現を使用する方法

この記事は、Linux Professional Institute の Junior Level Administration (LPIC-1) 101 試験の主題 103 の 103.7 の試験対策となります。この目標の重要度は 2 です。

前提条件

この連載の記事を最大限に活用するには、Linux の基礎知識と、記事に記載されたコマンドを演習できる実際の Linux システムが必要です。プログラムのバージョンによって出力のフォーマットに違いが出てくる場合もあるため、コマンドの実行結果は必ずしもここに記載するリストや図とまったく同じであるとは限りません。この記事は、以前の記事「Linux の 101 試験対策: テキスト・ストリームとフィルター」で説明した概念をベースに作成されています。


サンプルのセットアップ

Ian とつながるには

Ian は developerWorks で人気の高いお馴染みの著者の 1 人です。Ian が書いたすべての developerWorks 記事を閲覧してみてください。また、My developerWorks では、Ian のプロフィールを調べることや、彼やその他の著者、そして他の読者とつながることができます。

この記事では、記事「Linux の 101 試験対策: テキスト・ストリームとフィルター」で作成したファイルを用いてコマンドの実践演習を行います。このファイルをまだ作成していない、またはファイルは作成したけれども保存しなかったという場合には、ホーム・ディレクトリー lpi103-7 にサブディレクトリーを新規に作成し、このディレクトリー内に必要なファイルを作成するところから始めてください。ファイルを作成するには、ホーム・ディレクトリーをカレント・ディレクトリーとしてテキスト・ウィンドウを開きます。次にリスト 1 の内容をウィンドウにコピーして、これらのコマンドを実行すると、これから使用する lpi103-7 サブディレクトリーとファイルが作成されます。

リスト 1. サンプル・ファイルの作成
mkdir -p lpi103-7 && cd lpi103-7 && {
echo -e "1 apple\n2 pear\n3 banana" > text1
echo -e "9\tplum\n3\tbanana\n10\tapple" > text2
echo "This is a sentence. " !#:* !#:1->text3
split -l 2 text1
split -b 17 text2 y; 
cp text1 text1.bkp
mkdir -p backup
cp text1 backup/text1.bkp.2
}

ウィンドウにはリスト 2 のような内容が表示され、カレント・ディレクトリーは新しく作成された lpi103-7 ディレクトリーになっているはずです。

リスト 2. サンプル・ファイルの作成 – 出力
ian@attic4:~$ mkdir -p lpi103-7 && cd lpi103-7 && {
> echo -e "1 apple\n2 pear\n3 banana" > text1
> echo -e "9\tplum\n3\tbanana\n10\tapple" > text2
> echo "This is a sentence. " !#:* !#:1->text3
echo "This is a sentence. " "This is a sentence. " "This is a sentence. ">text3
> split -l 2 text1
> split -b 17 text2 y; 
> cp text1 text1.bkp
> mkdir -p backup
> cp text1 backup/text1.bkp.2
> }
ian@attic4:~/lpi103-7$

正規表現

正規表現の起源は、コンピューター言語の理論にあります。コンピューター・サイエンスを学ぶ学生のほとんどは、正規表現で表すことのできる言語は、有限オートマトンが受理する言語とまったく同じであると学びます。この記事で説明する正規表現はそれよりも複雑な内容を表現できるので、コンピューター・サイエンスの授業で習った正規表現とは同じではありませんが、その内容を継承していることは明らかです。

正規表現 (別名「regex」または「regexp」) とは、プログラムが任意のテキスト文字列に対してマッチさせることのできるテキスト文字列、つまりパターンを記述する手段であり、極めて強力な検索機能を提供します。Linux または UNIX® のプログラマーや管理者であれば誰でもツールボックスに標準装備している grep (一般的な正規表現プロセッサー) では、ファイルの検索やコマンド出力に正規表現を使用することができます。記事「Linux の 101 試験対策: テキスト・ストリームとフィルター」で紹介したもう 1 つの標準ツール、ストリーム・エディター sed でも、ファイルまたはテキスト・ストリームでのテキストの検索と置換に幅広く正規表現を使用しています。grepsed という 2 つの標準ツールで使用する正規表現については、この記事で説明するので、よく読んで十分理解してください。ちなみに、正規表現を広範に使用するプログラムには awk もあります。

この連載の他の記事で取り上げた話題と同じく、正規表現やコンピューター言語理論に関する資料はひと通り揃っています。お勧めの資料については、「参考文献」を参照してください。

正規表現について学んでいるうちに、正規表現の構文とワイルドカード (グロビング) の構文 (記事「Linux の 101 の試験対策: ファイルとディレクトリーの管理」で説明) には似ているところがあると思うかもしれませんが、その類似性は表面的なものに過ぎません。


基本構成要素

ほとんどの Linux システムに備わっている GNU grep プログラムでは、正規表現の構文として、基本構文と拡張構文という 2 つの形式が使用されます。GNU grep の場合、この 2 つの構文形式に機能上の違いはありません。この記事では基本構文について説明しますが、拡張構文と異なる点についても説明します。

正規表現は文字と演算子からなり、メタ文字によって表現可能な範囲が広がります。大部分の文字はその文字自体とマッチします。また、ほとんどのメタ文字はバックスラッシュ (\) を使用してエスケープする必要があります。基本的な操作は以下のとおりです。

連結
2 つの正規表現をつなげて、長い正規表現を作成します。例えば正規表現 a は、abcdcba という文字列と 2 回マッチします (最初の a と最後の a)。これは、正規表現 b についても同じです。けれども、連結して ab とすれば abcdcba の ab とだけマッチし、ba とすれば abcdcba の ba とだけマッチします。
繰り返し
クリーニ代数の * (繰り返し演算子) は、直前の正規表現の 0 回以上の繰り返しとマッチします。したがって、a*b のような表現は、b で終わるあらゆる a の文字列だけでなく、単独の b ともマッチします。クリーニ代数 * については、エスケープの必要はありません。そのため文字としてのアスタリスク (*) とマッチさせたい場合の表現では、アスタリスクをエスケープする必要があります。正規表現での * の使い方は、グロビングでの使い方とは異なります。グロビングでのアスタリスクは、任意の文字列とマッチします。
選言
選言演算子 (|) は、この演算子の左右の表現のいずれかとマッチします。基本構文では、この演算子をエスケープする必要があります。例えば、a*\|b*c という表現は、任意の数の a または任意の数の b が含まれ (ただし、この 2 文字が両方含まれてはいない)、1 文字の c で終わる文字列とマッチします。この場合も同じく、単独の c 文字とはマッチします。

シェルへの入力が長くなるのを避けるために正規表現を使わなければならないことは度々あります。


ファイルおよびファイルシステムの検索

以降の説明では、記事の最初で作成したテキスト・ファイルを例として使用します (「サンプルのセットアップ」を参照)。リスト 3 の単純な例をよく見てください。grep は必須パラメーターに正規表現を使用した上で、検索対象とするファイルを 0 個以上指定していることに注意してください。ファイルが指定されない場合、grep は stdin を検索対象とするため、パイプラインで使用できるフィルターとなります。マッチする行がなければ、grep からの出力はありませんが、その終了コードをテストすることはできます。

リスト 3. 単純な正規表現
ian@attic4:~/lpi103-7$ grep p text1
1 apple
2 pear
ian@attic4:~/lpi103-7$ grep pea text1
2 pear
ian@attic4:~/lpi103-7$ grep "p*" text1
1 apple
2 pear
3 banana
ian@attic4:~/lpi103-7$ grep "pp*" text1
1 apple
2 pear
ian@attic4:~/lpi103-7$ grep "x" text1; echo $?
1
ian@attic4:~/lpi103-7$ grep "x*" text1; echo $?
1 apple
2 pear
3 banana
0
ian@attic4:~/lpi103-7$ cat text1 | grep "l\|n"
1 apple
3 banana
ian@attic4:~/lpi103-7$ echo -e "find an \ns* here" | grep "s\*"
s* here

上記の例からわかるように、時には意外な結果になることもあります。それは特に、繰り返し演算子を使用した場合に言えることです。皆さんは、p* が複数の p とマッチすると予想したことでしょう。p* ではなかったとしても、少なくとも pp* はそうなると予想していたはずです。けれども x* も、ファイルのすべての行とマッチしています。その理由は、* 演算子は直前の正規表現の 0 回以上の繰り返しとマッチすることになっているからです。

上記の例のうち、2 つが grep からの終了コードを示しています。このように、マッチする部分が見つかると 0 の値が返され、見つからない場合には 1 の値が返されます。1 より大きい値 (GNU grep の場合は常に 2) は、検索しようとしているファイルが存在しないなど、エラーが発生した場合に返される終了コードです。

基本的なショートカット

grep で正規表現の基本構成要素を使えるようになったところで、以下に便利なショートカットをいくつか紹介しておきます。

+
+ 演算子は * 演算子と似ていますが、+ 演算子の場合、直前の正規表現の 1 回以上の繰り返しとマッチするという点が異なります。この演算子は、基本構文ではエスケープしなければなりません。
?
? は、直前の表現がオプションであることを示します。つまり、その表現が 0 回または 1 回出現することを表します。これは、グロビングで使用する ? とは異なります。
.
. (ドット) は、任意の文字を表すメタ文字です。最もよく使われるパターンには .* があり、このパターンは任意の文字が含まれる (または文字がまったく含まれない) 任意の長さの文字列とマッチします。言うまでもなく、このパターンは長い表現の一部として使用されます。単一のドットはグロビングでの ? に相当し、.* はグロビングでの * に相当します。
リスト 4. 複雑な正規表現
ian@attic4:~/lpi103-7$ grep "pp\+" text1 # at least two p's
1 apple
ian@attic4:~/lpi103-7$ grep "pl\?e" text1
1 apple
2 pear
ian@attic4:~/lpi103-7$ grep "pl\?e" text1 # pe with optional l between
1 apple
2 pear
ian@attic4:~/lpi103-7$ grep "p.*r" text1 # p, some string then r
2 pear
ian@attic4:~/lpi103-7$ grep "a.." text1 # a followed by two other letters
1 apple
3 banana

行の始まり、または終わりとのマッチ

^ (キャレット) は行の始まりとマッチし、$ (ドル記号) は行の終わりとマッチします。したがって、^..b は、行の先頭にある任意の 2 文字とそれに続く b とマッチします。一方、ar$ とすると、ar で終わる任意の行とマッチします。正規表現 ^$ は空の行とマッチします。

さらに複雑な表現

これまでは、単一の文字に適用される繰り返し演算子について説明してきましたが、複数の文字で構成される文字列が 1 回または複数回出現するのを検索する (例えば、banana に 2 回出現する an など) には、括弧を使用してください (基本構文では、括弧はエスケープする必要があります)。同様に、. のような一般的な表現や、選言演算子のような長い表現を使わずにいくつかの文字を検索したいという場合もあります。そうした場合には、それらの文字を角括弧 ([]) で囲みますが、ここで使われる角括弧についてはエスケープする必要はありません。角括弧で囲まれた表現は、文字クラスを構成します。後で説明するようにいくつかの例外もありますが、角括弧を使用すると、. や * などの特殊文字をエスケープする必要もなくなります。

リスト 5. 括弧および文字クラス
ian@attic4:~/lpi103-7$ grep "\(an\)\+" text1 # find at least 1 an
3 banana
ian@attic4:~/lpi103-7$ grep "an\(an\)\+" text1 # find at least 2 an's
3 banana
ian@attic4:~/lpi103-7$ grep "[3p]" text1 # find p or 3
1 apple
2 pear
3 banana
ian@attic4:~/lpi103-7$ echo -e "find an\ns* here\nsomewhere." | grep "s[.*]"
s* here
ian@attic4:~/lpi103-7$ echo -e "find an\n * in position 2." | grep ".[.*]"
 * in position 2.

その他にも興味深い文字クラスを使用することができます。

範囲
範囲は、- (ハイフン) で分けられた 2 つの文字で表現します。例えば、数字の場合には 0-9、16 進数字の場合には 0-9a-fA-F のようになります。範囲はロケールに依存することに注意してください。
名前付き文字クラス
よく使用される文字クラスの省略形として、名前付き文字クラスを使用すると便利な場合があります。名前付き文字クラスは [: で始まり、:] で終わります。また、括弧を使った表現のなかに含めることもできます。以下は名前付き文字クラスの例です。
[:alnum:]
英数字
[:blank:]
スペースおよびタブ文字
[:digit:]
0 から 9 の数字 (0-9 に相当)
[:upper:] と [:lower:]
それぞれ大文字と小文字
^ (否定)
文字クラスの [ に続く最初の文字として ^ (キャレット) を使用すると、残りの文字の否定を意味するので、文字クラス内の文字 (先行する ^ を除く) が含まれていない場合にマッチします。

上記の特殊な意味を踏まえると、文字クラス内で文字としての - (ハイフン) とマッチさせたい場合には、ハイフンを先頭または最後に置くことになります。また、文字としての ^ (キャレット) とマッチさせるには、キャレットを先頭に置いてはなりません。さらに、] (右の角括弧) は先頭に配置されていない限り、文字クラスを閉じます。

文字クラスは、正規表現とグロビングとで似ているもののひとつです。ただし、否定についてはそれぞれ ^、! を使用する点が異なります。リスト 6 に文字クラスの例をいくつか記載します。

リスト 6. その他の文字クラス
ian@attic4:~/lpi103-7$ # Match on range 3 through 7
ian@attic4:~/lpi103-7$ echo -e "123\n456\n789\n0" | grep "[3-7]"
123
456
789
ian@attic4:~/lpi103-7$ # Find digit followed by no n or r till end of line
ian@attic4:~/lpi103-7$ grep "[[:digit:]][^nr]*$" text1
1 apple
ian@attic4:~/lpi103-7$ # Find a digit, n, or z followed by no n or r till end of line
ian@attic4:~/lpi103-7$ grep "[[:digit:]nz][^nr]*$" text1
1 apple
3 banana

最後の例は意外でしたか?この例では、最初の角括弧表現が、任意の数字、n、または z が含まれる文字列とマッチする一方で、n が文字列に含まれる場合は最後に出現する n の後に別の n または r が続いていなければマッチします。そのため na で終わっている文字列は、この正規表現とマッチするというわけです。

マッチする部分の強調表示

色や太字、または下線などで強調表示して区別できる場合には、マッチする部分を強調表示するように GREP_COLORS 環境変数を設定することができます。デフォルトの設定では、マッチする部分が赤い太字で強調表示されます (図 1 を参照)。この図からは、出力された最初の行はその行全体がマッチしている一方、2 番目の行では最後の 2 文字だけがマッチしていることがわかります。

図 1. grep でマッチした部分に対する、色を使った強調表示
上記の説明のように、grep によるマッチが色で強調表示されています。

正規表現に馴染みがない場合、あるいは grep によって特定の行が返された理由がよくわからない場合には、この手法が役に立つはずです。


拡張正規表現

正規表現の拡張構文は GNU 拡張の 1 つです。これまで基本構文で使用してきた括弧や「?」、「+」、「|」、「{」などはエスケープしなければなりませんでしたが、この拡張により、これらの文字を使用するときにエスケープする必要がなくなります。その一方、正規表現でこれらの文字を文字として解釈させたい場合には、エスケープしなければなりません。正規表現の拡張構文を使用していることを示すには、-E (または grep の --extended-regexp オプション) を使用します。または、egrep コマンドを使用することもできます。リスト 7 に、前に説明した方法を使用した例とともに egrep でこれに対応する拡張表現を使用した場合の例を記載します。

リスト 7. 拡張正規表現
ian@attic4:~/lpi103-7$ # Find b followed by one or more an's and then an a
ian@attic4:~/lpi103-7$ grep "b\(an\)\+a" text1 
3 banana
ian@attic4:~/lpi103-7$ egrep "b(an)+a" text1
3 banana

ファイルの中身の検索

以上で基本は理解できたので、grepfind の力を利用してファイルシステム内でさまざまな検索を行ってみましょう。ここで用いる例も比較的単純なもので、以前の記事で作成したファイルか、この記事の冒頭で lpi103-7 ディレクトリーとそのサブディレクトリー内に作成したファイルを使用します (「サンプルのセットアップ」を参照)。この連載の以前の記事で作成したファイルを使用する場合は、今回作成したファイルより数が多いため、マッチする結果も多くなります。

まず、grep では複数のファイルを一度に検索することができます。-n オプションを追加すると、マッチした行の番号が示されます。マッチした行の数だけを知りたい場合には -c オプションを、マッチ結果が含まれるファイルのリストだけが必要な場合には -l オプションを使用してください。リスト 8 に例を記載します。

リスト 8. grep による複数ファイルの検索
ian@attic4:~/lpi103-7$ grep plum *
text2:9	plum
yaa:9	plum
ian@attic4:~/lpi103-7$ grep -n banana text[1-4]
text1:3:3 banana
text2:2:3	banana
ian@attic4:~/lpi103-7$ grep -c banana text[1-4]
text1:1
text2:1
text3:0
ian@attic4:~/lpi103-7$ grep -l pear *
text1
text1.bkp
xaa

リスト 8 の -c オプションを使用した例には、text3:0 という行が示されています。ファイル内でのオカレンス数を知りたいという場合はよくありますが、検索している対象のオカレンスがまったくないファイルを知りたいとは思わないはずです。grep コマンドには -v オプションがあります。このオプションを指定すると、マッチしない行だけが出力に表示されます。したがってこのオプションを指定して、コロンと 0 で終わる行を検索するための正規表現 :0$ を使用すれば、オカレンスがあるファイルだけを表示できるというわけです。

これを行うのが次の例です。リスト 9 では find を使用して、カレント・ディレクトリーとそのサブディレクトリー内にある通常のファイルをすべて見つけ出した後、これらのファイルのリストを xargs によって grep に渡し、各ファイルでの banana のオカレンス数を調べます。そして最後に、別の grep を呼び出して出力をフィルタリングします。今度は -v オプションを指定して :0 で終わっていないすべての行を検索し、文字列 banana が実際に含まれるファイルでのオカレンス数だけを表示します。

リスト 9. banana のオカレンスが 1 つ以上あるファイルの絞り込み検索
ian@attic4:~/lpi103-7$ find . -type f -print0| xargs -0 grep -c banana| grep -v ":0$"
./backup/text1.bkp.2:1
./text2:1
./text1:1
./yaa:1
./xab:1
./text1.bkp:1

正規表現と sed

記事「Linux の 101 試験対策: ストリーム・エディターとフィルター」でストリーム・エディター sed を紹介するときに、sed は正規表現を使用すると説明しました。sed では、アドレス表現と置換表現で正規表現を使用することができます。

何かを検索したいだけであれば、おそらく grep だけで用は足りるでしょう。しかし、マッチする行から検索文字列や関連する文字列を抽出して操作するとしたら、代わりに sed を使用したほうが賢明です。ここからは、その仕組みを見ていきます。まず初めに、サンプル・ファイルのうち、text1 と text2 では数字の後に空白文字、次にフルーツの名前が続いていること、text3 ではセンテンスが繰り返されていることを思い出してください。リスト 10 に、これらのファイルの内容を記載します。

リスト 10. text1、text2 および text3 の内容
ian@attic4:~/lpi103-7$ cat text[1-3]
1 apple
2 pear
3 banana
9	plum
3	banana
10	apple
This is a sentence.  This is a sentence.  This is a sentence.

手始めに grepsed のそれぞれを使用して、1 つ以上の数字で始まり、その後に空白文字 (スペースまたはタブ) が続く行だけを抽出します。通常、sed はサイクルの終了時にすべての行を出力するため、sed-n オプションを使って出力を抑止した後、sed 内で p コマンドを使用して正規表現とマッチする行だけを出力します。両方のツールに適用する正規表現が同じであることを確実にしたいので、正規表現は変数に割り当てることにします。

リスト 11. grep と sed それぞれによる検索
ian@attic4:~/lpi103-7$ oursearch='^[[:digit:]][[:digit:]]*[[:blank:]]'
ian@attic4:~/lpi103-7$ grep "$oursearch" text[1-3]
text1:1 apple
text1:2 pear
text1:3 banana
text2:9	plum
text2:3	banana
text2:10	apple
ian@attic4:~/lpi103-7$ cat text[1-3] | sed -ne "/$oursearch/p"
1 apple
2 pear
3 banana
9	plum
3	banana
10	apple

複数のファイルを検索する場合、grep は常にファイル名を表示することに注意してください。sed には cat を使用して入力を提供したので、sed が元のファイル名を認識する方法はありません。しかし期待したとおり、マッチした行は両方のツールでまったく同じです。

次に、検索する行の 2 番目の単語だけが必要だという設定にします。この例で 2 番目の単語に該当するのはフルーツの名前ですが、このような検索には、HTTP URL やファイル名など、あらゆるものが対象として考えられます。この例の場合は、上記の例でマッチさせようとした文字列そのものを削除するだけで十分なので、リスト 12 の方法を使えます。

リスト 12. sed による、先行する数字の削除
ian@attic4:~/lpi103-7$ cat text[1-3] | sed -ne "/$oursearch/s/$oursearch//p"
apple
pear
banana
plum
banana
apple

最後の例として、行のフルーツの名前の後に何らかの文字が続いている場合を考えてみてください。そこで、text1、text2 および text3 を合成したものに「lemon  pie」という行を追加し、lemon の部分だけを取り出す方法を説明します。さらに、出力をソートし、重複している値を削除することで、検出されたフルーツのリストには、それぞれのフルーツが 1 度だけ表示されるようにします。

ここでは、これを実現する 2 通りの方法を示します。最初の方法では、先行する数字とそれに続く空白文字を取り除き、残った部分からさらに最初のスペースまたはタブの後に続くすべてのものを取り除いた後、残された部分だけを出力します。リスト 13 に示す 2 番目の方法では、括弧を導入して行全体を 3 分割し、番号とそれに続く空白文字、2 番目の単語、それ以外の部分に分けます。そして s コマンドを使って行全体を 2 番目の単語のみに置き換え、結果を出力するという方法です。3 つ目の \(.*\) の部分を省略したバージョンを実行して、その結果を説明できるかどうか試してみるとよいかもしれません。

リスト 13. フルーツの部分のみを表示する
ian@attic4:~/lpi103-7$ echo "7 lemon pie" | cat - text[1-3] |
> sed -ne "/$oursearch/s/\($oursearch\)\([^[:blank:]]*\)\(.*\)/\2/p" |
> sort | uniq
apple
banana
lemon
pear

古いバージョンの sed のなかには、拡張正規表現をサポートしないものもあります。お使いのバージョンの sed が拡張正規表現をサポートしていない場合には、-r オプションを指定することで、sed に拡張構文を使用していることを伝えてください。リスト 14 に、oursearch 変数に必要な変更と、リスト 13 の基本正規表現で行った内容と同じことを拡張正規表現で行うようにするために sed コマンドに必要な変更を示します。

リスト 14. sed で拡張正規表現を使用する場合
ian@attic4:~/lpi103-7$ echo "7 lemon pie" | cat - text[1-3] |
> sed -nre "/$oursearchx/s/($oursearchx)([^[:blank:]]*)(.*)/\2/p" |
> sort | uniq
apple
banana
lemon
pear
plum

この記事では、grepsed で正規表現を使用して Linux コマンドラインで実行可能な内容を表面的に説明したに過ぎません。この 2 つの貴重なツールについては、man ページで詳しく学んでください。

参考文献

学ぶために

製品や技術を入手するために

  • developerWorks から直接ダウンロードできる IBM ソフトウェアの試用版を使用して、Linux で次の開発プロジェクトを構築してください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux
ArticleID=472065
ArticleTitle=Linux の 101 試験対策: 正規表現を使用したテキスト・ファイルの検索
publish-date=02032010