正規表現は、Linuxユーザー、システム管理者、またはプログラマーとして、ツールボックスで最も強力なツールの1つになる可能性があります。また、学ぶのが最も難しいことの1つになることもありますが、そうである必要はありません。式を書く方法は無数にありますが、すべてのスイッチとフラグを学ぶ必要はありません。この短いハウツーでは、すぐに実行できる正規表現を使用する簡単な方法をいくつか紹介し、必要に応じて正規表現マスターになるためのフォローアップリソースを共有します。
>「正規表現」パターンまたは「正規表現」とも呼ばれる正規表現は、簡単に言うと「検索パターンを定義する一連の文字」です。このアイデアは、1950年代にスティーブンコールクリーンが「正規言語」と呼んだアイデアの説明を書いたときに生まれました。その一部は「クリーンの定理」として知られるようになりました。非常に高いレベルでは、言語の要素を定義できれば、その言語内のパターンに一致するように式を記述できると言われています。
その他のLinuxリソース
- Linuxコマンドのチートシート
- 高度なLinuxコマンドのチートシート
- 無料のオンラインコース:RHELの技術概要
- Linuxネットワーキングのチートシート
- SELinuxチートシート
- Linuxの一般的なコマンドのチートシート
- Linuxコンテナとは何ですか?
- 最新のLinux記事
それ以来、正規表現は、vi、sed、awk、grepなどの初期のUnixプログラムの一部になっています。実際、grepという単語は、最も初期の「ed」エディターで使用されていたコマンド、つまり g / re / p
に由来しています。 、これは基本的に「この正規表現をグローバル検索して行を出力する」ことを意味します。かっこいい!
上記のように、正規表現はパターンを定義するために使用され、そのパターンに一致するオブジェクトを照合または「検索」するのに役立ちます。 find
を使用する場合、これらのオブジェクトはファイルシステム内のファイルにすることができます たとえば、コマンド、またはgrep、awk、vi、sedなどを使用して検索する可能性のあるファイル内のテキストのブロック。
最初から始めましょう。始めるのにとても良い場所です。
誰もが学んでいるように見える最初の正規表現は、おそらくあなたがすでに知っていて、それが何であるかを理解していなかったものです。ディレクトリ内のファイルのリストを印刷したいと思ったことはありますが、長すぎましたか?誰かが\*。gif
と入力するのを見たことがあるかもしれません 次のようなディレクトリにGIF画像を一覧表示するには:
$ ls *.gif
これは正規表現です!
正規表現を作成する場合、特定の文字には特別な意味があり、文字だけを照合するだけでなく、文字セット全体を照合することもできます。この場合、 *
「star」または「splat」とも呼ばれる文字は、ファイル名の代わりに使用され、 .gif
で終わるすべてのファイルを照合できます。 。
正規表現fooトレーニングの次のステップは、ファイル内のパターンを検索することです。特に、置換パターンを使用してすばやく変更を加えます。
これを行う2つの一般的な方法は次のとおりです。
- viを使用してファイルを開き、パターンを検索して変更を加えます(replaceを使用しても自動的に)。
- 「ストリームエディタ」(別名sed)を使用して、プログラムでファイル内を検索し、変更を加えます。
viを使用して次のファイルを編集することにより、正規表現を学習することから始めましょう。
The quick brown fox jumped over the lazy dog.
Simple test
Harder test
Extreme test case
ABC 123 abc 567
The dog is lazy
ここで、このファイルをviで開いた状態で、内部で一致する文字列を見つけ、それらを自動的に置き換えるのに役立つ正規表現の例をいくつか見てみましょう。
簡単にするために、大文字小文字を無視するようにviを設定しましょう。 set ic
と入力します 大文字と小文字を区別しない検索を有効にします。
ここで、viで検索を開始するには、 /
と入力します。 文字の後に検索パターンが続きます。
「Simple」で始まる行を見つけるには、次の正規表現パターンを使用します。
/^Simple
下の画像では、「Simple」で始まる行のみが強調表示されていることに注意してください。カラット記号( ^
)は「で始まる」と同等の正規表現です。
次に、 $
を使用しましょう 正規表現で話す記号は「で終わる」です。
/test$
「テスト」で終わる両方の行がどのように強調表示されるかを確認してください。また、4行目にはtestという単語が含まれていますが、最後には含まれていないため、この行は強調表示されていません。
これは正規表現の力であり、多数の一致を簡単にすばやく確認できますが、具体的には完全一致のみをドリルダウンできます。
正規表現のスキルをさらに伸ばすために、一致するテキストだけでなく、一致するパターンも検索できる、より一般的な特殊文字をいくつか見てみましょう。
頻度一致文字:
* | ゼロ以上 | ab * –文字 a その後に0個以上のb |
+ | 1つ以上 | ab + –文字 a その後に1つ以上のb |
? | ゼロまたは1つ | ab? –ゼロまたは1つだけの b |
{n} | 番号を指定して、その番号を正確に見つけます | ab {2} –手紙 a ちょうど2つのbが続きます |
{n、} | 番号を指定して、少なくともその番号を見つけます | ab {2、} –手紙 a 少なくとも2つのbが続きます |
{n、y} | 2つの数字が与えられたら、その数字の範囲を見つけます | ab {1,3} –手紙 a その後に1〜3個の b |
正規表現トレーニングの次のステップは、パターンマッチングで文字のクラスを使用することです。ここで重要なのは、これらのクラスは [a、d、x、z]
などのリストとして組み合わせることができるということです。 、または [a-z]
などの範囲として 、およびその文字は通常、大文字と小文字が区別されます。
この動作をviで表示するには、前に設定した無視ケースをオフにする必要があります。次のように入力してみましょう: set noic
大文字と小文字を区別しないようにします。
範囲として使用される文字の一般的なクラスは次のとおりです。
- a-z –すべて小文字
- A-Z –すべて大文字
- 0-9 –数字
それでは、以前に実行したものと同様の検索を試してみましょう:
/tT
何も見つからないことに気づきましたか?これは、前の正規表現が正確に「tT」を検索するためです。これを次のように置き換えた場合:
/[tT]
ドキュメント全体で小文字と大文字の両方のTが一致していることがわかります。
それでは、いくつかのクラス範囲をチェーンして、何が得られるかを見てみましょう。試してみてください:
/[A-Z1-3]
大文字と123が強調表示されていますが、小文字(5行目の終わりを含む)は強調表示されていないことに注意してください。
正規表現トレーニングを開始する最後のステップは、範囲内にリストする必要なしに、特殊なタイプの文字を検索するために存在するフラグを理解することです。
。コード> –任意の文字
-
\ s
–空白 -
\ w
–単語 -
\ d
–数字(数字)
たとえば、サンプルテキストのすべての数字を検索するには、次を使用します。
/\d
以下の例では、すべての数字が強調表示されていることに注意してください。
反対に一致させるには、通常は同じフラグを使用しますが、大文字を使用します。例:
-
\ S
–スペースではありません -
\ W
–言葉ではありません -
\ D
–数字ではありません
以下の例では、 \ D
を使用していることに注意してください。 、数字を除くすべての文字が強調表示されます。
sedで検索
sedに関する簡単なメモ:これはストリームエディタです。つまり、ユーザーインターフェイスを操作しません。片側に入ってくるストリームを受け取り、反対側に書き込みます。
sedの使用はviと非常に似ていますが、検索と置換のための正規表現を指定し、出力を返す点が異なります。例:
sed s/dog/cat/ examples
次の画面に戻ります:
そのファイルを保存したい場合は、少しだけ注意が必要です。いくつかのコマンドをチェーンして、a)そのファイルを書き込み、b)最初のファイルの上にコピーする必要があります。
これを行うには、次のことを試してください:
sed s/dog/cat/ examples > temp.out; mv temp.out examples
ここで、の例
を見ると ファイルを表示すると、「犬」という単語が置き換えられていることがわかります。
The quick brown fox jumped over the lazy cat.
Simple test
Harder test
Extreme test case
ABC 123 abc 567
The cat is lazy
これが正規表現の概要として役立つことを願っています。もちろん、これは氷山の一角に過ぎません。以下の追加リソースを確認して、この強力なツールについて引き続き学習していただければ幸いです。
- 私のお気に入りのリソースはPERLポケットリファレンスです。
- 正規表現の高度な習得については、正規表現の習得をご覧ください。 ジェフ・フリードル
その他の例については、チェックアウトしてください
- Linuxでファイルを見つける方法
- Regexp::Commonを使用したPerlでのデータ検証
- Vimを愛する7つの理由