🧠

Linuxさんの正規表現とワイルドカード、grepコマンド②

2021/01/05に公開

はじめに

くーばねてすをやっつけるためにLinuxさんと仲良くさせていただいているが、Linuxさんには超大量のテキストがあって、検索するときにいろいろな表現で検索できるらしい。

概要

■繰り返しを指定するメタ文字
■複数の文字列をグループ化して指定するメタ文字
■実はgrep以外でもいろいろ使えるよ!

繰り返しを指定するメタ文字

■'文字*'直前の文字が0回以上繰り返されることを指定する。

'文字*' または '[文字]*'         {ゼロ回以上!)

単独で使わず、必ず文字(またはメタ文字)の後ろにくっつけて置く。

$  cat drink.txt
ber
beer
beeeeeeeeeeeeeeer!!!
bear
br
my vodka
my wine
wine wine
winewine
$ grep 'be*r' drink.txt
ber(1回繰り返し)
beer(2回繰り返し)
beeeeeeeeeeeeeeer!!!(いっぱい繰り返し!!!)
br(0回繰り返し) 

利用例2(bで始まり、eかaを使いさらにそれを0回以上繰り返しrで終わる文字列を検索)

$ cat drink.txt
ber
beer
beeeeeeeeeeeeeeer!!!
bear
br
my vodka
my wine
wine wine
winewine
$ grep '^b[ea]*r$' drink.txt
ber
beer
bear
br

※*は0回以上!!!

《拡張正規表現による繰り返し回数の指定》

待って拡張正規表現ってなに('_')!!!
拡張正規表現とは正規表現に付け足しで追加されたやつら。
後付けでついたやつらなので普通にgrepコマンド単体で使えない。
grepコマンドに拡張正規表現を使える -Eオプション を指定すると使える。
付け足さないで同じように使えるようにしてほしかったなぁ。

■'文字+'(直前の文字が1回以上繰り返されることを指定する)(※拡張正規表現)

'文字+'         {1回以上)

※ファイルの内容は上と同じ

$ grep -E 'be+r' drink.txt
ber
beer
beeeeeeeeeeeeeeer!!!

1回以上繰り返しの単語が出てきた!
↓ちなみに

\

を拡張正規表現の前に置くと-Eオプション無しでも動作する。

$ grep 'be\+r' drink.txt
ber
beer
beeeeeeeeeeeeeeer!!!

でも他コマンドに影響することがあるので+は拡張正規表現なんだなーと思って素直に-Eオプションをつけたほうが良いらしい。
拡張正規表現単体で使用するときなら使ってok(そんなに使いこなせない('_'))。
※プラスは1回以上なのでプラスって覚えた!

■'文字?'(直前の文字が0回または1回繰り返されることを指定する)(※拡張正規表現)

'文字?'        {0回か1回)

↓スペースを0回または1回で指定してみた。

$ grep -E 'wine ?wine' drink.txt
wine wine
winewine

できた!^^
※クエスチョンは1回か2回なので控えめ!って覚えた!

■{数字}で繰り返し回数を指定(※拡張正規表現)

これまではざっくりとした回数しか設定することが出来なかったけど、{}さんは回数を指定することができるぞ!!!{A,B}でA回以上B回以下を指定できる。

{数字}            {数字以上)
{数字,数字}                 {数字以上数字以下)

・{2}で2回の繰り返しを指定して検索!↓

$ grep -E 'be{2}r' drink.txt
beer

・{1,2}で1回以上2回以下を指定

$ grep -E 'be{1,2}r' drink.txt
ber
beer

・ちなみに{数字,}で数字回以上を指定することもできる('_')

$ $grep -E 'be{2,}r' drink.txt
beer
beeeeeeeeeeeeeeer!!!

■繰り返し指定メタ文字

|正規表現|拡張正規表現|意味|
| --- | --- | --- | --- |
|||0回以上の繰り返し|
|無し|+|1回以上の繰り返し|
|無し|?|0回または1回の繰り返し|
|/{A,B/}|{A,B}|A回以上B以下の繰り返し|
|/{A./}|{A,}|A回以上の繰り返し|
↑の/ですがうまく表現できないので/と書いてますが,正しくは
こうです↓

\{A,B\}
\{A,\}

表にしてみたかったの...(@_@)!!!

複数の文字列をグループ化して指定するメタ文字

これまでの表現は1文字に対してしか指定できなかったが、複数の文字列をグループ化して指定することができる。
例えばwinewineやwinewinewineなど「wine」というワードを指定したい時は、
()
というメタ文字を指定する。

(文字列)で複数の文字列を指定(※拡張正規表現)

(文字列)          {ワードを指定)

↓wineを2回以上の繰り返しを検索

$ grep -E '(wine){2,}' drink.txt
winewine

ややこしいけど''で囲むの忘れない!

(文字列1|文字列2)で文字列1か文字列2かを指定する

(文字列1|文字列2)     {文字列1か文字列2)

↓vodkaかwineを検索する

$ grep -E 'my (vodka|wine)' drink.txt
my vodka
my wine

もしかしてもっとor増やせる?
↓ちょいまとめ

<グループ化する>
正規表現      \(\)
拡張正規表現    ()
<複数の文字列をorで指定する>
正規表現      なし
拡張正規表現    (文字列1|文字列2) 

↑\ってなっちゃうからもう黒くしたよ!('_')

実はgrep以外でもいろいろ使えるよ!

grepだけでなくて、vimやlessコマンドでも/を入力することで正規表現、拡張正規表現を使ったテキスト検索ができる!

まとめ

正規表現って算数みたいで難しい!って思った!('_')
正規表現と拡張表現をわけないでほしかったなって思った。
今日先輩に昨日間違えて会社来ましたよね?って言われたので気のせいですよって言っといた!

Discussion