GNU/Linux >> Linux の 問題 >  >> Linux

正規表現:すべてをまとめる

正規表現の紹介 、概念と基本を紹介し、次に正規表現の開始:例 、名前と電子メールアドレスのリストをクリーンアップして、一貫性があり、解析できるようにする例を説明しました。 正規表現とgrep:データフローとビルディングブロックに飛び込んだ後 、正規表現について詳しく説明しました。次に、最初の例からコマンドラインプログラムを短縮および簡略化する方法を検討します。ここではgrepに焦点を当てます およびsed

例:メーリングリストプログラムの簡略化

まず、次のコマンドラインインターフェイス(CLI)プログラムを作成した最初の例を振り返ってみましょう。

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$" | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

この時点で正規表現が読みやすくなるかもしれませんが、このプログラムは単純化できます。

catとgrep

catを含むコマンドの最初に焦点を当てることから始めましょう およびgrep

cat Experiment_6-1.txt | grep -v Team | grep -v "^\s*$"

2つのgrepを組み合わせることができます 元々は次のように見えるステートメント:

| grep -v Team | grep -v "^\s*$" 

ヒント: grepからのSTDOUTの場合 は別のユーティリティを介してパイプされません。カラーをサポートするターミナルエミュレータを使用すると、出力データストリームで正規表現の一致が強調表示されます。

改訂されたコマンドは次のとおりです。

grep -vE "Team|^\s*$"

ここに、 Eを追加しました 拡張正規表現を指定するオプション。 grepによると マニュアルページ:

「GNUgrepでは、基本構文と拡張構文で使用可能な機能に違いはありません。」

E がないと新しい結合式が失敗するため、このステートメントは厳密には当てはまりません。 オプション。次のコマンドを実行して結果を確認します。

[student@studentvm1 testing]$ cat Experiment_6-1.txt | grep -vE "Team|^\s*$"

Eなしでお試しください オプション。

それでは、 catを見てみましょう。 。 grep ツールはファイルからデータを読み取ることもできるため、 catを削除できます 完全にコマンド:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt

この変更と前の変更を合わせると、次のやや簡略化されたCLIプログラムが残ります。

grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/\[//g" -e "s/]//g" -e "s/)//g" -e "s/(//g" | awk '{print $1" "$2" <"$3">"}'

grep により、このコマンドは短く、簡潔になり、実行速度が速くなります。 データストリームを1回解析するだけで済みます。

注: 繰り返しになりますが、このソリューションだけが解決策ではないことを理解することが重要です。同じ出力を生成するためのBashにはさまざまな方法があり、PythonやPerlなどの他の言語も使用できます。そしてもちろん、LibreOfficeWriterマクロは常に存在します。しかし、私はいつでもLinuxディストリビューションの一部としてBashを頼りにすることができます。これらのタスクは、GUIデスクトップがないコンピューターやGUIデスクトップはあるがLibreOfficeがインストールされていないLinuxコンピューターでもBashプログラムを使用して実行できます。

sed

sedを簡略化することもできます 指図。 sed ユーティリティは、正規表現パターンに一致するテキストを検索できるだけでなく、一致したテキストを変更、削除、または置換することもできます。 sedを使用しています コマンドラインおよびBashシェルスクリプトで、テキストをすばやく簡単に見つけて変更することができます。名前sed データストリームを変換できる他のツールと同じ方法でデータストリームを操作するため、ストリームエディタの略です。これらの変更のほとんどは、データストリームから特定の回線を選択し、それらを別のトランスフォーマープログラムに渡すことを含みます。

注: 多くの人がgrepのようなツールを呼び出します フィルタプログラム 、データストリームから不要な行をフィルタリングするためです。 トランスフォーマーという用語が好きです 、 sedのようなツールが およびawk 単にフィルタリングする以上のことをします。さまざまな文字列の組み合わせについてコンテンツをテストし、さまざまな方法で一致するコンテンツを変更できます。 sortなどのツール 、 head tail uniq fmt 、その他すべてが何らかの方法でデータストリームを変換します。

すでにsedを見てきました 実際に動作していますが、正規表現を理解することで、以前の使用法をより適切に分析および理解できるようになりました。 sedで使用される5つの式のうち4つを組み合わせることができます 単一の式へのコマンド。 sed コマンドに5つではなく2つの式が追加されました:

sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

この形式では、より複雑な式を理解するのが少し難しくなります。 1つのsedの式の数に関係なく注意してください コマンドに含まれている場合、データストリームは、すべての式に一致するように1回だけ解析されます。

改訂された式をさらに詳しく調べてみましょう:

-e "s/[]()\[]//g"

デフォルトでは、 sed すべての[を解釈します セットの先頭としての文字、および最後の] そのセットの終わりとしての文字。したがって、上記のコードでは、最初の [ そして最後の] セットが含まれています。介在する] 文字はメタ文字として解釈されません。

[と一致させる必要があるため データストリームから削除するためのリテラル文字として、および sed 通常、[を解釈します メタ文字として、リテラルの] として解釈されるように、エスケープする必要があります。 。ここでバックスラッシュ( \ )が入り、 \ [ 真ん中に。

この新しいバージョンをCLIスクリプトに接続して、テストしてみましょう。

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g"

私はあなたが何を求めているか知っています:「 \[を配置してみませんか [の後 セットを開き、]の前に キャラクター?」私と同じように試してみてください:

[student@studentvm1 testing]$  grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[\[]()]//g"`

私はそれがうまくいくはずだと思いますが、そうではありません。このような予期しない結果がほとんどないことから、各正規表現を注意深くテストして、意図したとおりに機能することを確認する必要があることが明らかになります。

私自身の実験の結果、エスケープされた左の四角いブレース \ [ 最初の式を除いて、式のすべての位置で正常に機能します。この動作は、 grepに記載されています。 おそらく最初に読むべきだったmanページ。しかし、実験は私が読んだものを強化するものであり、私は通常、私が探していたものよりも興味深いものを発見します。

最後のコンポーネントであるawkを追加します ステートメント、最適化されたプログラムは次のようになり、結果はまさに私たちが望むものです:

[student@studentvm1 testing]$ grep -vE "Team|^\s*$" Experiment_6-1.txt | sed -e "s/[Ll]eader//" -e "s/[]()\[]//g" | awk '{print $1" "$2" <"$3">"}'
正規表現を実装するその他のツール

多くのLinuxツールは正規表現を実装しています。これらの実装のほとんどは、 awkの実装と非常によく似ています。 、 grep 、および sed 、だから違いを学ぶのは簡単なはずです。 awkについては詳しく説明していませんが、正規表現も実装する強力なテキスト処理言語です。

より高度なテキストエディタのほとんどは正規表現を使用します。 Vim、gVim、Kate、GNUEmacsも例外ではありません。 少ない ユーティリティは、LibreOffice Writerの検索および置換機能と同様に、正規表現を実装します。

Perl、awk、Pythonなどのプログラミング言語にも正規表現の実装が含まれているため、テキスト操作用のツールを作成するのに非常に適しています。

リソース

正規表現について学ぶための優れたリソースをいくつか見つけました。ここにリストした以上のものがありますが、これらは私が特に有用であることがわかったものです:

  • grep マニュアルページには優れたリファレンスがありますが、正規表現について学ぶには適していません。
  • O’Reillyの本、正規表現の習得 、Jeffrey E. F. Friedlによる、正規表現の優れたチュートリアルおよびリファレンスです。正規表現を使用するので、Linuxシステム管理者である、またはなりたい人にはお勧めします。
  • O’Reillyの本 sed&awk:UNIX Power Tools アーノルド・ロビンスとデール・ドハティによる、もう一つの良いものです。これらの強力なツールの両方をカバーし、正規表現についての優れた議論もあります。

正規表現について学ぶのに役立ち、興味深い便利なクックブックスタイルの正規表現の例を提供する優れたWebサイトもいくつかあります。それらを使用する見返りにお金を要求する人もいます。 Linuxの使用と管理の第1巻と第2巻のテクニカルレビュー担当者であるJasonBaker コースは、regexcrossword.comを優れた学習ツールとして提案しています。

概要

このシリーズでは、正規表現の複雑な世界について簡単に紹介しました。 grepで正規表現の実装を調べました 正規表現で達成できる驚くべきことのいくつかのアイデアをあなたに与えるのにちょうど十分な深さのユーティリティ。また、正規表現を実装するいくつかのLinuxツールとプログラミング言語についても見てきました。

しかし、間違いはありません!これらのツールと正規表現の表面をかじっただけです。学ぶべきことはまだまだたくさんあります。ご覧のとおり、そうするための優れたリソースがいくつかあります。

注: この記事は、2019年後半にApressからリリースされる、私のLinux自習コース「Linuxの使用と管理:ZeroからSysAdmin」の第2巻の第6章を少し変更したものです。


Linux
  1. 10 の例を含む grep コマンドの高度な正規表現 – パート II

  2. 10 の例を含む grep コマンドの正規表現 – パート I

  3. \d は grep の基本式でサポートされていませんか?

  1. sed の正規表現で `\d` が機能しないのはなぜですか?

  2. ディレクトリとそのすべてのサブディレクトリ内の文字列を grep する方法は?

  3. すべての ALSA デバイスを一覧表示する

  1. grep パターンで \b はどういう意味ですか?

  2. Bashで二重文字を見つけるための正規表現

  3. すべてのディスクの簡単なリストを取得する