Linuxで私が正規表現を使用する5つの方法(そして、それがなぜ非常に重要なのか)
正規表現の使い方を覚えると、それが非常に役立つことに気づくでしょう。コツは小さく始めることです - 方法をお見せします。
クイック: もしあなたがLinuxユーザーの群れの中で「正規表現」と叫んだら、どうなるでしょうか?
答え: 誰もがそれらの正しい使い方を教えてくれるでしょうが、すべての答えは異なります。
正規表現(しばしばregexと呼ばれる)は、テキスト内の検索パターンを定義する文字のシーケンスです。それだけでは一発屋のように聞こえるかもしれませんが、これらのものがどれほど役立つかに驚くことでしょう。
正規表現は、パートナーのマッチング、テキスト処理、データ検証などに使用できます。
正規表現を使用する際の唯一の注意点は、非常に複雑になる可能性があることです。それはほぼ独自の言語にまで達することがあります。正規表現の使い方を理解すると、それらが非常に価値のあるものになることがわかります。正規表現を使えば、他の何を使ってもできないようなことができ、コマンドラインやバッシュスクリプトとの相互作用がはるかに強力になります。
私が正規表現を使用する5つの異なる方法を強調させてください。
まず、正規表現パターンについて話しましょう。
正規表現パターンは何で構成されていますか?
正規表現について理解する必要がある基本的な概念は4つあります:
- リテラル文字は指定された正確な文字と一致します(例:"hello" は「hello」のみと一致します)。
- キャラクタークラスは、セット内の文字をグループ化します(例: [a-zA-Z] は、'a' から 'z' までの任意の文字に一致します)。
- パターンマッチングは、文字列内のパターンを一致させるために使用されます(例:\wは任意の単語文字と一致します)。
- 量指定子はパターンが一致すべき回数を指定します(例えば、*は0回以上の出現、+は1回以上の出現に一致します)。
こちらが正規表現の構文の概要です:
- ^- 文字列の開始
- \ - エスケープキャラクター
- .- 任意の単一文字
- [a-z] - 'a'から'z'までの任意の小文字の文字
- [A-Z] - 'A'から'Z'までの任意の大文字
- [0-9] - '0'から'9'までの任意の数字
- $- 文字列の終わり
ここにいくつかの基本的な例があります:
- ZDNET - 文字列 "ZDNET" に一致します。
- [a-zA-Z] - 'A'から'z'までの任意の文字にマッチします。
- \d{5} - 正確に 5 桁に一致します (例: 01234)。
- ^ZDNET$- 文字列の開始と終了に一致し、"ZDNET"(他の文字列の一部ではない)であることを確認します。
- (abc) - 文字をグループ化して、後でキャプチャおよび参照できるようにします。
- \S+ - 一つ以上の非空白文字にマッチします。
たとえば、grepを使ってテキストファイル(テストという名前)内の文字列ZDNETを以下のように検索することができます:
grep ZDNET testそれでは、そのファイルの先頭に「Hello, ZDNET!」があるとしましょう。上記のコマンドは次のように出力されます:
Hello, ZDNET!しかし、もし私が^ZDNET$を使ったらどうなりますか?上記の例では、ZDNETはより長い文字列の一部であるため、結果は得られません。もし、一方で、ZDNETだけを含む行があった場合、次のコマンドを使ってそれを見つけることができます:
grep ^ZDNET$ test
$記号は文字列の終わりを示すので、パターンマッチングはZDNETの後で終了します。
さて、Linuxで正規表現を使用する5つの異なる方法を見てみましょう。
1. ファイル管理(grepを使って)
私はすでに正規表現がgrepコマンドとどのように使用できるかを示しました。しかし、コマンドラインからgrepコマンドを使用することでLinuxのファイル管理を強化できることを知っておくことが重要です。正規表現とgrepを使用すると、シンプルなパターンや非常に複雑なパターンを持つテキストファイルの中からパターンを検索することができます。
ホワイトスペースや句読点のマッチングに正規表現を使用することもできます。これにより、句読点の後の余分なスペースを取り除くのに役立ちます。以下はその例です:
grep -E ' [^a-zA-Z0-9\.\?\!]' input.txtこれを分解しましょう:
- grep - パターンに一致する行を検索して出力するためのコマンドです。
- -E - 拡張正規表現構文を有効にします。
- ・正規表現を囲む二つの単一引用符の最初のもの。
- - スペース文字(単一のスペースと一致します)。
- この正規表現は、小文字のアルファベット(a-z)、大文字のアルファベット(A-Z)、数字(0-9)、ピリオド(.)、疑問符(?)、および感嘆符(!)以外の任意の1つの文字にマッチします。^は、通常の[]の動作を否定します。
- 入力ファイル - 検索するファイル
- ・正規表現を囲む二つの単一引用符のうちの二つ目。
そのファイルに次の行があるとしましょう:
Hello, ZDNET! How has your day been?
ZDNET
My name is Jack. What's yours?最初の行にだけ、小文字(a-z)、大文字(A-Z)、数字(0-9)、ピリオド(.)、疑問符(?)、感嘆符(!)以外の文字の前にスペースがありますので、出力にはその行のみが含まれます。
2. テキスト編集(Vimを使用)
Vimは強力なテキストエディタで、正規表現パターンのサポートを含んでいます。残念ながら、私の選んだエディタ(nano)は正規表現をサポートしていないので、その機能が必要な場合はVimを真剣に使わなければなりません。
次のテキストが含まれているファイルがあるとしましょう:
The old cat ran quickly.
But I saw an old woman walking down the path.
New albums are really cool!もし「old」を「new」に手動で置き換えたい場合はどうしますか?ファイルが3行だけなら簡単ですが、もっと大きい場合は、次の正規表現コマンド(Vim内で)を使って自動的にその変更を行うことができます。
:%s/\<old\>/new/g
このコマンドの内訳は次のとおりです:
- \<old\> - 単語「old」全体と一致し、他の単語の一部とは一致しません。\< は単語の境界の開始を示し、\> は単語の境界の終了を示します。
- 新しい - 置き換え用のテキスト。
- g - グローバルフラグで、行全体のすべての出現に対して置換を適用します。
3. テキスト編集(findとsedを使用)
テキスト編集の別の方法は、sedコマンドを使用することです。これは、テキストファイル内で検索と置換を行うためのもう一つの素晴らしいオプションです。上記と同じ例を使用し、次のコマンドを使って old を new に置き換えましょう。
find . -name "*.txt" -exec sed -E 's/old/new/g' {} \;find コマンドによって見つかった各ファイルに対してコマンドを実行するために -exec オプションを使用します。複数の *.txt ファイルでも同じことができ、正規表現がどれほど強力であるかを示す助けになります。
4. ip コマンドを使用したネットワーク構成
例えば、複数のネットワークカードが接続されたマシンがあるとしましょう(これは、そのマシンが私のLANに接続されたサーバーであることを示しています)。そのマシンには内部および外部のネットワーク接続があるかもしれず、私は192.168.1で始まるIPアドレスの接続のみを表示したいのです。それを行うために、私は2つのコマンドと正規表現を使用します。使用する2つのコマンドはipとgrepです。コマンドは次のようになります:
ip addr | grep -Eo '192\.168\.1\.[0-9]{1,3}'5. ログビュー
私はよくtailコマンドを使用してログを追跡し、正規表現を使って必要な情報だけを見ることができます。例えば、/var/log/syslogに表示されるエラーや警告だけを見たい場合があります。そのファイルを単純にtailして(syslogファイルに書き込まれた最後の数件のエントリーのリアルタイム更新を保ちます)、次のようにします:
tail -f /var/log/syslogその後、出力を調べてエラーまたは警告を探さなければなりません。より良い選択肢は、正規表現を使用してエラーや警告のあるエントリのみが表示されるようにすることで、次のようにtailとgrepを使用します:
tail -f /var/log/syslog | grep -E 'error|warning'そして、それが私が通常、正規表現をどのように使用するかです。私は正規表現の使用方法についてまだ表面をかすめただけです。正規表現が初めての場合は、小さく始めてそこから構築するようにしてください。そうしないと、混乱がすぐに増してしまう可能性があります。
毎朝、私たちのTech Today ニュースレターで、朝のトップストーリーをあなたの受信箱にお届けします。
