ターミナルあり:正規表現を使用

Linuxターミナルで私がいつも気に入っていることのXNUMXつは、正規表現を使用して実現できることです。 複雑なテキストを見つける必要がある場合でも、別のテキストに置き換える必要がある場合でも、正規表現を使用すると、作業が大幅に簡素化されます。 最初から始めましょう:

警告:この投稿はお尻の痛みです。 この投稿を常に読むと、意識を失う可能性があります。 投稿全体を読む前に、休憩を取るか、医師または薬剤師に相談してください。

正規表現とは何ですか?

正規表現は、検索したいテキストを説明できる一連の特殊文字です。 たとえば、「linux」という単語を検索する場合は、使用しているプログラムにその単語を含めるだけで十分です。 単語自体は正規表現です。 これまでのところ非常に単純に見えますが、特定のファイル内のすべての番号を検索したい場合はどうでしょうか。 または、大文字で始まるすべての行? そのような場合、あなたはもはや簡単な言葉を置くことができません。 解決策は、正規表現を使用することです。

正規表現とファイルパターン。

正規表現に入る前に、正規表現に関する一般的な誤解を解き明かしたいと思います。 正規表現は、ハードディスク上のさまざまなファイルを参照するためにrm、cpなどのコマンドにパラメーターとして入力するものではありません。 それはファイルパターンになります。 正規表現は、いくつかの一般的な文字を使用するという点では似ていますが、異なります。 ファイルパターンはハードディスク上のファイルに対して実行され、パターンに完全に一致するファイルを返します。一方、正規表現はテキストに対して実行され、検索されたテキストを含む行を返します。 たとえば、パターンに対応する正規表現 *.* それは次のようなものになります ^.*\..*$

正規表現の種類。

すべてのプログラムが同じ正規表現を使用するわけではありません。 それほど少なくはありません。 多かれ少なかれ標準的な正規表現にはいくつかの種類がありますが、構文をわずかに変更したり、独自の拡張機能を組み込んだり、まったく異なる文字を使用したりするプログラムもあります。 したがって、よく知らないプログラムで正規表現を使用する場合、最初に行うことは、プログラムのマニュアルまたはドキュメントを調べて、認識される正規表現がどのようなものかを確認することです。

まず、正規表現には主にXNUMXつのタイプがあり、Linuxツールで使用されるPOSIX標準に含まれています。 これらは、基本的な拡張正規表現です。 grepやsedなどの正規表現で機能するコマンドの多くでは、これらXNUMXつのタイプを使用できます。 それらについては以下で説明します。 PERLスタイルの正規表現もあり、vimやemacsのようなこれらのバリアントを使用するプログラムもあります。 やりたいことに応じて、どちらか一方を使用する方が適切な場合があります。

正規表現のテスト。

正規表現の構文は簡単なものではありません。 複雑な正規表現を書かなければならないときは、一見理解できない特殊文字の文字列の前にいるので、それらの使い方を学ぶには、必要なすべてのテストを実行する方法が不可欠です。結果は簡単です。 そのため、正規表現が支配的になるまで、テストを実行し、必要なすべてを実験できるいくつかのコマンドを配置します。

XNUMXつ目はgrepコマンドです。 これは、検索を行うために最も頻繁に使用するコマンドです。 構文は次のとおりです。

grep [-E] 'REGEX' FICHERO
COMANDO | grep [-E] 'REGEX'

シェルが私たちを狂わせないように、常に正規表現を一重引用符で囲むことをお勧めします。 最初の方法は、ファイル内の正規表現を見つけることです。 XNUMXつ目は、正規表現を使用してコマンドの出力をフィルタリングできるようにします。 デフォルトでは、grepは基本的な正規表現を使用します。 -Eオプションは、拡張正規表現を使用するためのものです。

正規表現がどのように機能するかを確認するのに役立つトリックは、grepコマンドで色の使用を有効にすることです。 そうすることで、使用している正規表現に一致するテキストの部分が強調表示されます。 grepコマンドで色をアクティブにするには、環境変数を確認してください。 GREP_OPTIONS 値に含める --color、これは次のコマンドで実行できます。

GREP_OPTIONS=--color

.bashrcに入れて、常にアクティブにすることができます。

正規表現を使用する別の方法は、sedコマンドを使用することです。 これはテキストの置換に適していますが、検索にも使用できます。 その構文は次のようになります。

sed -n[r] '/REGEX/p' FICHERO
COMANDO | sed -n[r] '/REGEX/p'

sedコマンドもデフォルトで基本的な正規表現を使用します。-rオプションを使用して拡張正規表現を使用できます。

私も名前を付けたいもうXNUMXつのコマンドはawkです。 このコマンドを使用すると、独自のプログラミング言語でスクリプトを記述できるため、さまざまな用途に使用できます。 ファイルまたはコマンドの出力で正規表現を探す必要がある場合、それを使用する方法は次のようになります。

awk '/REGEX/' FICHERO
COMANDO | awk '/REGEX/'

このコマンドは常に拡張正規表現を使用します。

テストを行うには、検索の例となるテキストも必要になります。 次のテキストを使用できます。

- Lista de páginas wiki:

ArchLinux: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/

- Fechas de lanzamiento:

Arch Linux: 11-03-2002
Gentoo: 31/03/2002
CentOs: 14-05-2004 03:32:38
Debian: 16/08/1993
Ubuntu: 20/10/2004

Desde Linux Rulez.

これは、残りの投稿の例で使用するテキストなので、ターミナルから手元にあるようにファイルにコピーすることをお勧めします。 好きな名前を付けることができます。 私はそれを正規表現と呼んでいます。

レッスン開始。

これで、正規表現のテストを開始するために必要なものがすべて揃いました。 少しずつ行きましょう。 正規表現を使用した検索の例をいくつか挙げて、各文字の目的を説明します。 それらはあまり良い例ではありませんが、私は非常に長い投稿をするつもりなので、これ以上複雑にしたくありません。 そして、正規表現でできることのほんの一部を紹介します。

最も簡単なのは、特定の単語を検索することです。たとえば、「Linux」という単語を含むすべての行を検索するとします。 次のように書くだけなので、これが最も簡単です。

grep 'Linux' regex

そして、結果を見ることができます:

アーチLinux:https://wiki.archlinux.org/ Arch Linux:11年03月2002日から Linux Rulez。

これらは「Linux」という単語を含むXNUMX行で、カラートリックを使用した場合は強調表示されます。 「ArchLinux」のように長い単語の一部であっても、探している単語を認識することに注意してください。 ただし、URL「https://wiki.archlinux.org/」に表示される「linux」という単語は強調表示されていません。 これは、小文字の「l」で表示され、大文字で検索したためです。 grepコマンドにはこのためのオプションがありますが、正規表現を扱う記事ではそれらについては説明しません。

この簡単なテストで、最初の結論を導き出すことができます。

  • 正規表現に入れられた通常の文字は、それ自体と一致します。

つまり、文字「a」を入力すると、文字「a」が検索されます。 論理的に思えますよね? 🙂

ここで、「CentO」という単語の後に任意の文字を検索したいとしますが、XNUMX文字だけです。 このために、「。」文字を使用できます。これは、任意の文字に一致するワイルドカードですが、次のXNUMXつだけです。

grep 'CentO.' regex

そして結果は次のとおりです。

CentOSの:http://wiki.centos.org/
CentO: 14-05-2004 03:32:38

つまり、「CentOS」に「S」が含まれていますが、ある場合は大文字で、別の場合は小文字です。 その場所に他のキャラクターが登場した場合は、それも含まれます。 すでにXNUMX番目のルールがあります:

  • キャラクター "。" 任意の文字に一致します。

見た目ほど些細なことではありませんが、これでは多くのことはできません。 もう少し進んでみましょう。 2002年と2004年が表示されている行を検索するとします。これらは、XNUMXつの検索のように見えますが、次のように一度に実行できます。

grep '200[24]' regex

つまり、200の後に2または4が続く数字を見つけたいということです。結果は次のようになります。

Arch Linux:11-03-2002
Gentoo:31/03 /2002
CentOs:14-05-2004 03:32:38
Ubuntu: 20/10/2004

これにより、XNUMX番目のルールが決まります。

  • 角かっこで囲まれた複数の文字は、角かっこ内の任意の文字と一致します。

ブラケットはより多くの遊びを与えます。 文字を除外するためにも使用できます。 たとえば、文字「:」が表示されているが、その後に「/」が付いていないサイトを検索するとします。 コマンドは次のようになります。

grep ':[^/]' regex

角かっこ内の最初の文字として「^」を入れるだけです。 必要なすべての文字を下に置くことができます。 この最後のコマンドの結果は次のとおりです。

ArchLinux: https://wiki.archlinux.org/
Gentoo: https://wiki.gentoo.org/wiki/Main_Page
CentOS: http://wiki.centos.org/
Debian: https://wiki.debian.org/
Ubuntu: https://wiki.ubuntu.com/
Arch Linux: 11年03月2002日Gentoo: 31年03月2002日CentOs: 14-05-2004 03:32:38 Debian: 16年08月1993日Ubuntu: 20/10/2004

これで、ディストロ名の後ろの「:」が強調表示されますが、URLの後に「/」が付いているため、URL内の名前は強調表示されません。

  • 角かっこの先頭に「^」文字を入れると、角かっこ内の他の文字を除くすべての文字と一致します。

もうXNUMXつできることは、文字の範囲を指定することです。 たとえば、「-」が後に続く任意の番号を検索するには、次のようになります。

grep '[0-9]-' regex

これにより、0から9までの文字を指定し、次にマイナス記号を指定します。 結果を見てみましょう:

Arch Linux:11-03-2002 CentOs:14-05-2004 03:32:38

角かっこ内に複数の範囲を指定して、範囲をXNUMX文字と混合することもできます。

  • 角かっこ内に「-」で区切られたXNUMXつの文字を配置すると、範囲内の任意の文字と一致します。

URLの最初の部分を選択できるかどうか見てみましょう。 「http」または「https」と書かれているもの。 最後の「s」だけが異なるので、次のようにしましょう。

grep -E 'https?' regex

疑問符は、左側の文字をオプションにするために使用されます。 ただし、コマンドに-Eオプションを追加しました。 これは、問い合わせが拡張正規表現の機能であるためです。 これまでは基本的な正規表現を使っていたので、何も入れる必要はありませんでした。 結果を見てみましょう:

ArchLinux: HTTPS://wiki.archlinux.org/ Gentoo: HTTPS://wiki.gentoo.org/wiki/Main_Page CentOS: HTTP://wiki.centos.org/ Debian: HTTPS://wiki.debian.org/ Ubuntu: HTTPS://wiki.ubuntu.com/

したがって、すでに新しいルールがあります。

  • 「?」が続く文字その文字に一致するか、まったく一致しません。 これは、拡張正規表現にのみ有効です。

次に、XNUMXつのまったく異なる単語を見つけます。 「Debian」と「Ubuntu」の両方を含む行を見つける方法を見てみましょう。

grep -E 'Debian|Ubuntu' regex

縦棒を使用すると、XNUMXつ以上の異なる正規表現を分離し、それらのいずれかに一致する行を見つけることができます。

Debianの:https://wiki.debian.org/
Ubuntu:https://wiki.ubuntu.com/
Debianの:16 / 08 / 1993
Ubuntu:20 / 10 / 2004
  • キャラクター«|» いくつかの正規表現を分離し、それらのいずれかと一致させるのに役立ちます。 また、拡張正規表現に固有です。

続けましょう。 次に、「Linux」という単語を探しますが、左側の別の単語に固定されていない場合に限ります。 私たちはこのようにそれを行うことができます:

grep '\

ここで重要な文字は「<」ですが、grepが特殊文字として解釈できるように、前に「\」を付けてエスケープする必要があります。 結果は次のとおりです。

アーチ Linux:11年03月2002日から Linux Rulez。

「\>」を使用して、隣り合っていない単語を検索することもできます。 例を見てみましょう。 このコマンドを試してみましょう:

grep 'http\>' regex

それが生成する結果は次のとおりです。

CentOSの: HTTP://wiki.centos.org/

「Http」は出てきましたが、「https」は出ていません。「https」では、「p」の右側に単語の一部となる文字がまだあるためです。

  • 文字「<」と「>」は、それぞれ単語の最初と最後に一致します。 これらの文字は、リテラル文字として解釈されないようにエスケープする必要があります。

もう少し複雑なことをします。 「+」文字は左側の文字と一致し、少なくともXNUMX回繰り返されます。 この文字は、拡張正規表現でのみ使用できます。 これを使用すると、たとえば、「:」で始まる行の複数の番号のシーケンスを見つけることができます。

grep -E ':[0-9]+' regex

結果:

CentOs:14-05-2004 03:32:38

番号38も「:」で始まるため、強調表示されています。

  • 「+」文字は左側の文字と一致し、少なくともXNUMX回繰り返されます。

「{」と「}」を使用して繰り返し回数を制御することもできます。 アイデアは、必要な繰り返しの正確な数を示す数を中かっこで囲むことです。 範囲を入れることもできます。 XNUMXつのケースの例を見てみましょう。

まず、次のXNUMX桁のシーケンスをすべて見つけます。

grep '[0-9]\{4\}' regex

基本的な正規表現を使用している場合は中括弧をエスケープする必要がありますが、拡張正規表現を使用している場合はエスケープしないでください。 拡張すると、次のようになります。

grep -E '[0-9]{4}' regex

そして、両方の場合の結果は次のようになります。

Arch Linux:11-03-2002
Gentoo:31/03 /2002
CentOs:14-05-2004 03:32:38
Debian: 16/08/1993
Ubuntu:20/10 /2004
  • 数字が間にある「{」と「}」の文字は、指定された回数繰り返された前の文字と一致します。

中かっこを使用したもう3つの例です。 6〜XNUMX個の小文字を含む単語を検索するとします。 次のことができます。

grep '[a-z]\{3,6\}' regex

そして結果はこれになります:

 -  LISTA de ページs ウィキ:TORchのLイヌックス: HTTPS:/ /ウィキ.archlinux.ORG/ Gエントゥー: HTTPS:/ /ウィキ.gentoo.ORG/ウィキ/MAIN_P年齢
CENTOSの: HTTP:/ /ウィキ.CentOSの.ORG/ D峨辺イアン: HTTPS:/ /ウィキ.Debianの.ORG/またはブンツ: HTTPS:/ /ウィキ.Ubuntuの.コム/ -Fあなたが恋しい de 打ち上げ:TORchの Lイヌックス:11年03月2002日Gエントゥー:31年03月2002日CENTOs: 14-05-2004 03:32:38
D峨辺イアン:16年08月1993日Uブンツ:20年10月2004日Dです Lイヌックス Rウレズ.

ご覧のとおり、これは私たちが望んでいたものとはあまり似ていません。 これは、正規表現が他の単語内のより長い文字を見つけるためです。 この他のバージョンを試してみましょう:

grep '\<[a-z]\{3,6\}\>' regex

結果:

-ページのリスト ウィキ:ArchLinux: HTTPS:/ /ウィキ.archlinux。ORG/ Gentoo: HTTPS:/ /ウィキ.gentoo.ORG/ウィキ/ Main_Page CentOS: HTTP:/ /ウィキ.CentOSの.ORG/ Debian: HTTPS:/ /ウィキ.Debianの.ORG/ Ubuntu: HTTPS:/ /ウィキ.Ubuntuの.コム/

これはすでに私たちが望んでいたもののように見えます。 私たちが行ったことは、単語が最初の文字の直前で始まり、最後の文字の直後で終わることを要求することです。

  • カンマで区切られたXNUMXつの数字を含む文字「{」と「}」は、XNUMXつの数字で示された回数繰り返された前の文字と一致します。

「+」の素数である文字を見てみましょう。 これは「*」であり、その操作は非常に似ていますが、ゼロを含む任意の数の文字に一致する点が異なります。 つまり、「+」と同じように機能しますが、左側の文字をテキストに表示する必要はありません。 たとえば、wikiで始まり、orgで終わるアドレスを探してみましょう。

grep 'wiki.*org' regex

結果を見てみましょう:

ArchLinux:https://wiki.archlinux.org/ Gentoo:https://wiki.gentoo.org/ wiki / Main_Page CentOS:http://wiki.centos.org/ Debian:https://wiki.debian.org/

パーフェクト。

今、私たちが見ようとしている最後のキャラクター。 「\」文字は、文字を右にエスケープして、特別な意味を失うために使用されます。 例:ある点で終わる線を見つけたいとします。 私たちに最初に起こるかもしれないことはこれかもしれません:

grep '.$' regex

結果は私たちが探しているものではありません:

-wikiページのリスト:
ArchLinux:https://wiki.archlinux.org/
Gentoo:https://wiki.gentoo.org/wiki/Main_Page
CentOS:http://wiki.centos.org/
Debian:https://wiki.debian.org/
Ubuntu:https://wiki.ubuntu.com/
-リリース日:Arch Linux:11年03月200日2
Gentoo:31/03/2002
CentOs: 14-05-2004 03:32:38
Debian:16/08/1993
Ubuntu:20/10/2004
Desde Linux ルールズ.

これは「。」が原因です。 正規表現はすべてに一致するため、正規表現は各行の最後の文字に一致します。 解決策はこれです:

grep '\.$' regex

これで、結果は私たちが望むものになります。

Desde Linux ルールズ.

ゲームオーバー

正規表現の主題は非常に複雑なので、一連の記事を提供しますが、すでに十分な苦痛を与えていると思います。 なんとか到着できたら、おめでとうございます。 そして、これらすべてを一度に読んだ場合は、アスピリンか何かを服用してください。それは良くないからです。

今のところそれだけです。 この記事が気に入ったら、別の記事を書くことができます。 それまでの間、ターミナルですべての正規表現を試して、それらがどのように機能するかを明確に確認することをお勧めします。 そして覚えておいてください:正規表現を使用してHTMLを解析できるのはチャックノリスだけです。


コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:MiguelÁngelGatón
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。

  1.   エゼキエル

    正規表現がなければ、私たちの生活はどうなるでしょうか。
    この記事はとても役に立ちますが、少しずつ読んでいきます。 どうもありがとう。

    1.    ヘクスボーグ

      コメントありがとうございます。 私はまだ私の記事が出たとは思わない。 🙂エラーが発生しましたが、お役に立てば幸いです。 🙂

  2.   スキャリバー

    ありがとうssssssss!..

    少し前に、正規表現について少し勉強しなければなりませんでした....教えてくれてありがとう..そしてそれらのそれぞれを学ぶためのステップバイステップガイド..

    とても良いです!....私はそのアスピリンを手に入れるつもりです..ee

    1.    ヘクスボーグ

      どういたしまして。 勇気とその正規表現はあなたと一緒にできません🙂

  3.   タンラックス

    素晴らしい投稿です! よくやった。 何時間かかったのかしら😀

    1.    ヘクスボーグ

      笑!! 問題は、私が言いたいことをすべて言っていたら、何時間かかったでしょうか。 無限!! 🙂

  4.   タンムーズ

    私が知らなかった一つのこと、良い記事!

    1.    ヘクスボーグ

      ありがとうございました。 それをあなたと共有することは喜びです。

  5.   ヘレナ流

    素晴らしい説明。 おめでとうございます!本当に便利です!

    1.    ヘクスボーグ

      お役に立ててうれしいです。 ですから、書くことは喜びです。

  6.  

    これはどこか特別な場所に行くはずです。 特集のようですが、それは非常に特定の有用性を持っています。 非常に便利ですが、Vimに適用してもらいたいと思います。

    1.    ヘクスボーグ

      それは自分自身に問いかけることです。 正規表現に関する記事がもう少しあります。 そして、私はそれらの中でvimについて話すことができました。 この記事で説明したものとはいくつかの違いがあります。 それはそれを続けることの問題です。 🙂

  7.   フェルナンド

    グッド!

    あなたの記事は非常に優れており、興味深いものです。最近 (今)、数日間準備していた正規表現のメタキャラクターのリストといくつかの例を集めたエントリーを自分の Web サイトに公開しました。そして、エントリーすることは公平でした DesdeLinux 同じトピックに関するエントリを参照してください。

    それが慰めであるならば、私のものははるかに猫です😀

    確かに、正規表現は最も便利なもののXNUMXつです。通常、正規表現を使用してコマンドの出力をトリミングし、関心のある部分を保持してから、たとえばbashスクリプトで正規表現を操作します。 私は大学でもそれらを頻繁に使用しており、コンパイラーの構築(辞書編集およびパーサーの定義)において非常に重要です。 要するに、全世界。

    ご挨拶と非常に良い仕事。

    1.    ヘクスボーグ

      どうもありがとうございます。

      私もあなたの記事が好きでした。 それは私のものよりも簡潔です。 クイックリファレンスとして使用できます。 同時に書いたのは偶然です。 あなたは人々が主題に興味を持っているのを見ることができます。 🙂

  8.   エラリー

    ダミーの正規表現=)、grepの色で出力を取得する方法のひとつは、.bashrcエイリアスgrep = 'grep –color = always'にエイリアスを作成することです。誰かのために働きます。

    よろしく

    1.    ヘクスボーグ

      本当。 それはそれを行う別の方法です。 ご入力いただきありがとうございます。 🙂

  9.   KZKG ^我愛羅

    O_O…貢献の一部!!! O_O..。
    投稿ありがとうございました、しばらく待っていました笑、家で静かに読んで、集中する手間がかからないように開いたままにしておきます笑。

    記事をありがとう、私は本当にします😀

    1.    ヘクスボーグ

      私はあなたがそれを望んでいることを知っていました。 笑!! 真実は多くのものが欠けているということです、しかし私はすでに第二の部分を念頭に置いています。 🙂

  10.   EliécerTatés

    素晴らしい記事です。昨日読んだだけで、今日行ったクラスは生徒にとってさらに簡単だったでしょう。

    1.    ヘクスボーグ

      笑!! 遅刻したのは残念ですが、お役に立ててうれしいです。 🙂

  11.   レオトロ

    最後に!!!、非常に良い投稿…。私はついに正規表現を明確に説明する何かを見つけました…..

    1.    ヘクスボーグ

      そこにはたくさんの情報がありますが、理解しやすいものを見つけるのはもっと難しいです。 そのギャップを埋めてよかったです。 🙂

      ご挨拶。

  12.   シェイクスピアロードス

    ちょっと助けが必要です。/var/logsをyymmddの形式で検索する必要があります。ログは130901.log-130901.logのようになり、1月11日からXNUMX月XNUMX日までのすべてのログを検索する必要があります。 、私がなんとかした唯一のことは、XNUMX月のすべてを削除することでしたが、完全なチェーンを実行する方法がわかりません。

    例:1309 [0-3]は、1月30日から1月11日までのログを返しますが、XNUMX月XNUMX日からXNUMX日まで同じチェーンに入る方法がわかりません。

    1.    ヘクスボーグ

      正規表現を使用してそれを行うのは少し複雑です。 このようなことがうまくいくかもしれないと私は思います:

      13(09[0-3]|10(0|1[01]))

      これは拡張正規表現です。 使用しているツールがわからないため、詳細を説明することはできません。

      とにかく、これは正規表現を使用する代わりに、findで行う方が良いと思います。 あなたはこのようなことを試すことができます:

      見つける。 -newermt '01 sep'-a! -newermt '11oct'-印刷

      幸運。 これがお役に立てば幸いです。

  13.   チポ

    こんにちは!まず、このページは私の最高のLinuxサイトの「トップ3」に含まれているので、あなたの仕事に感謝したいと思います。
    私は練習していて、電話番号の正規表現が機能しない理由がわかりませんでした。「-E」がないことが原因でした(この投稿のおかげでわかりました)。
    少し想像力を働かせれば自分でそれらを発明する練習をすることができますが、RegExpに演習がある良いPDFやサイトを知らないかどうか尋ねたいと思いました。

    こんにちは、パブロ。

  14.   ケイリー

    とても良いです、私はそれをすべて読んだだけです、そしてはい今私はアスピリンが必要です🙂

  15.   オスカー

    正規表現について私が見た中で最も良い説明。 この作品を共有してくれた作者に感謝します。

    挨拶。

  16.   アレクサダー

    私は本当に良い説明が好きでした