ホームページ  >  記事  >  php教程  >  grepの使い方を詳しく解説 grepと正規表現

grepの使い方を詳しく解説 grepと正規表現

高洛峰
高洛峰オリジナル
2016-12-13 14:28:031204ブラウズ

正規表現は単なる表現です。ツールがこの表現をサポートしている限り、ツールは正規表現文字列を処理できます。 vim、grep、awk、sed はすべて正規表現をサポートしています。私が以前働いていた会社では正規表現が強力でした。その会社は Web ベースのサービス Web サイト (nginx) でした。需要が比較的大きいため、私も正規表現の勉強に時間を費やしたので、それを皆さんと共有したいと思います:

1 基本的な正規表現
grep ツール。これは以前紹介したものです。
grep -[acinv] '検索内容文字列' ファイル名
-a テキストファイル内を検索
-c 見つかった一致する行数をカウント
-i 大文字と小文字を無視
-n ちなみに行番号を出力
-v 選択を反転、つまり、検索文字列を含まない行を検索します
検索文字列は正規表現にすることができます

1
を含む行を検索し、行番号を出力します
$grep -n 'the' Regular_express.txt
を検索しますのない行、そして行番号を出力します
$grep -nv 'the' Regular_express.txt

2 設定された文字を検索するには [] を使用します
[] は文字の 1 つを表します。たとえば、[ade] は a または d またはe
woody@xiaoc:~ /tmp$ grep -n 't[ae]st' Regular_express.txt
8:テストを終えることができません

を使用できます。 []内の先頭の^記号は[]内の文字以外の文字を示します。
たとえば、oo の前に g のない文字列を含む行を検索します。検索文字列として '[^g]oo' を使用します
woody@xiaoc:~/tmp$ grep -n '[^g]oo' Regular_express.txt
2 : リンゴは私の好きな食べ物です
3: サッカーの試合は足だけを使うのではありません
19: goooooogle はい! as [a-z] は小文字を表し、[0-9] は 0 から 9 までの数字を表し、[A-Z] は大文字を表します。 [a-zA-Z0-9] はすべての数字と英語の文字を表します。 もちろん、^ を使用して文字を除外することもできます。
数字を含む行を検索
woody@xiaoc:~/tmp$ grep -n '[0-9]' Regular_express.txt
5:ただし、このドレスは約 $3183 ドルです
15:You are the best is menu.あなたは No.1 です。

行の先頭と末尾の文字 ^ $ は行の先頭を表し、$ は行の末尾 (文字ではなく位置) を表します。空白行。
行しかないため、行頭と行末。
ここでの ^ の意味は、[] で使用される ^ とは異なります。これは、^ の後の文字列が行の先頭にあることを意味します。
たとえば、
woody@xiaoc:~/tmp$ grep -n '^the' Regular_express.txt で始まる行を検索します
12: 記号 '*' は星印で表されます

小文字で始まる行を検索します。文字
woody@xiaoc:~/tmp$ grep -n '^[a-z]' Regular_express.txt
2: リンゴは私の好物です
4: この服は私には似合わない
10: オートバイは車より安いです。
12: 記号「*」は、キーワードを検索するのに最適なツールです。
woody@xiaoc:~/tmp $

英語の文字で始まらない行を検索
woody@xiaoc:~/tmp$ grep -n '^[^a-zA-Z]' Regular_express.txt
1:「オープンソース」は良い仕組みです
21: #I am VBird
woody@xiaoc:~/tmp$

$ は、その前の文字列が行末にあることを意味します (「.」など)。
末尾に . が付いている行を検索します
woody@xiaoc :~/tmp$ grep -n '.$' Regular_express.txt // は正規表現の特殊な記号なのでエスケープします
1: 「オープンソース」はプログラムを開発するための良い仕組みです。
2:リンゴは私の好きな食べ物です。
4:このドレスは私には似合わないです。
5:しかし、このドレスは約 3183 ドルです。
6:GNU はフリー エアではなく、フリー ビールです。
....

MS システムで生成されたテキスト ファイルでは、改行に ^M 文字が追加されることに注意してください。したがって、最後の文字は非表示になります ^M、Windows でテキストを処理する場合は特に注意してください
!
cat dos_file | tr -d 'r' > を使用して ^M シンボルを削除できます。 ^M==r

その後、「^$」は行の先頭と末尾の空行のみが取り出されるという意味になります。
空行を検索
woody@xiaoc:~/tmp$ grep -n '^$' Regular_express.txt
22:
23:
woody@xiaoc:~/tmp$

空行以外を検索
woody@ xiaoc:~ /tmp$ grep -vn '^$' Regular_express.txt
1:「オープンソース」はプログラムを開発するための優れたメカニズムです
2:リンゴは私の好物です
3:サッカーの試合は足だけを使用するものではありません。
4 : このドレスは私には似合わない
..........

繰り返しの文字。bash では、* は任意の数の文字を表すために使用されるワイルドカード文字を表しますが、正規表現では、* は 0 個以上の特定の文字を表します。
たとえば、oo* は、最初の o が存在する必要があり、2 番目の o には 1 つまたは複数の o が存在するか、または存在しないことを意味します。つまり、少なくとも 1 つの o を表し、

ドットが存在する必要があります。 g??d は「g..d」で表すことができます。 Good、gxxd、gabd.... はすべて一貫しています。

woody@xiaoc:~/tmp$ grep -n 'g..d' Regular_express.txt
1:「オープンソース」はプログラムを開発するための優れたメカニズムです
9:ああ、スープはおいしいです! 'glad' も同様です
woody@xiaoc:~/tmp$

o が 2 つ以上ある文字列を検索
woody@xiaoc:~/tmp$ grep -n 'ooo*' Regular_express.txt //最初の 2 つの o は存在する必要がありますが、3 番目の o は存在しないか、複数の o が存在する可能性があります。
1:「オープンソース」はプログラムを開発するための良い仕組みです。
2:リンゴは足だけを使うものではありません。
18:Google はおいしいです。キーワード検索に最適なツールです。
19:goooooogle Yes!

g で始まり、間に少なくとも 1 つの o がある文字列を検索します。つまり、gog、goog...gooog...などです。
woody@xiaoc:~/ tmp$ grep -n 'goo*g' Regular_express.txt
18:google はキーワード検索に最適なツールです

g で始まる行と終わる行を検索します
woody@xiaoc:~ /tmp$ grep -n 'g.*g' Regular_express.txt // .* は 0 個以上の任意の文字を表します
1:「オープンソース」はプログラムを開発するための優れたメカニズムです
14:gdソフトウェアは、プログラムを作成するためのライブラリです。
19:goooooogle
20:行きましょう


連続する文字の範囲を制限します。 * 0 以上のみ制限できます。繰り返し文字数を具体的に制限したい場合は、{range} を使用します。範囲は数値に使用され、2~5 を表すには 2,5 で区切られます。
2 は 2、2 を表し、2 つ以上を表します。
SHELL では { } が特別な意味を持つため、正規表現として使用される場合があります。エスケープを使用する必要があります。

2 つの o を含む文字列を含む行を検索します。
woody@xiaoc:~/tmp$ grep -n 'o{2}' Regular_express.txt
1:「オープンソース」はプログラムを開発するための優れたメカニズムです
2:リンゴは私の好きな食べ物です。は足だけではありません
18:google は検索キーワードに最適です

「g」の後に「o」を 1 つ続けて検索してください。文字列の列。
woody@xiaoc:~/tmp$ grep -n 'go{2,5}g' Regular_express.txt
18:google は検索キーワードに最適なツールです


検索には g の後に 2 つ以上の o が含まれます。次に g の行をたどります。 。
woody@xiaoc:~/tmp$ grep -n 'go{2,}g' Regular_express.txt
18:google は検索キーワードに最適なツールです


[] に注意してください。 ^ - は特別な意味を表すものではないため、[] 内の内容の後に配置できます。
「[^a-z.!^ -]」は、小文字、No!、スペース、- 文字列を含まないことを意味します。[] には小さなスペースが含まれていることに注意してください。

さらに、シェルでの逆選択は [!range]、正規表現では [^range] です


2 拡張正規表現

拡張正規表現は、基本的な正規表現にいくつかの特別なコンポーネントを追加します。
特定の操作がより便利になります。
たとえば、空白行と # で始まる行を削除したい場合は、次のようにします。
woody@xiaoc:~/tmp$ grep -v '^$' Regular_express.txt | '^#'
「オープンソース」はプログラムを開発するための良い仕組みです。
リンゴは私の好きな食べ物です。
この服は私には似合わないです。

ただし、拡張正規表現と拡張特殊記号 | をサポートする egrep を使用する方がはるかに便利です。
grep は基本的な式のみをサポートしますが、egrep は拡張式をサポートすることに注意してください。実際、egrep は grep -E の別名にすぎません。したがって、 grep -E は拡張正規表現をサポートします。
その後:
woody@xiaoc:~/tmp$ egrep -v '^$|^#' Regular_express.txt
「オープンソース」はプログラムを開発するための優れたメカニズムです
リンゴは私の好物です
サッカーの試合はそうではありません。足だけを使ってください。
このドレスは私には似合わないです。またはの関係。 つまり、^$ または ^# を満たす文字列です。

ここではいくつかの拡張特殊記号を示します:
+、これは . * と同様の機能を持ち、1 つ以上の繰り返し文字を表します。
? は . * と同様の効果があり、0 または 1 文字を表します。
| は、または関係を表します。たとえば、「gd|good|dog」は、コンテンツの一部をユニット グループに結合する gd、good、または Dog
() を含む文字列を表します。 たとえば、「glad」または「good」を検索したい場合は、「g(la|oo)d」
() を使用できます。利点は、グループに対して + ? * などを使用できることです。
たとえば、A と C で始まり A と C で終わり、間に少なくとも 1 つの (xyz) がある文字列を検索したい場合は、次のように実行できます: 'A(xyz)+C'

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。