joppot

コピペで絶対動く。説明を妥協しない

unix プログラミング

grepコマンドを使って正規表現を色々試してみるその2

投稿日:2014年2月18日 更新日:


faw

概要

みなさんこんにちはcandleです。今回は前回に引き続き、正規表現を勉強していきましょう。

前提

  1. unixを使用するので、多少、unixコマンドになれていること

サンプル文章

今回は下の文章を用いて、正規表現の勉強を行います。

1642年12月25日(旧暦)イギリスリンカーンシャー州ウールスソープの農家に生まれる。
父は生まれる3ヶ月前に死去、母は2年後に再婚し、その後は祖母に育てられる。神童であったらしい。
1661年(18歳)ケンブリッジにあるトリニティカレッジに入学。3年生の頃から独自の学問、研究を始める。
1665年(22歳)二項定理、微分を発見、後に微分積分学へと発 展。この年に万有引力の法則などを発見し、驚異の年と呼ばれる。
1669年(26歳)ケンブリッジ大学のルーカス数学教授に就任する。この頃反射望遠鏡を発明し、後に王立協会の会員に選出される。
1687年(44歳)「自然哲学の数学的原理(プリンキピア)」を刊行。
1699年(56歳)教え子の縁で造幣局長官に就任。偽金づくりの摘発やお札のデザインなどで手腕を発揮し、死ぬまで職を続ける。
1703年(60歳)王立協会会長に就任。この職も死ぬまで続ける
1727年(85歳)3月20日、発作により85年の生涯を閉じる。

出典:http://www.geocities.jp/nkkagosu50/page146.html

これをn.txtという名前でデスクトップにでも保存してください。

n_txt

ターミナルを開いてデスクトップに移動します。

準備ができました。

[ ] は文字群のどれか1文字をマッチする

[ ]はその中に1234567890と書いたりして、その中のどれか一文字にマッチさせたります。

例えば、サンプルコードに対して検索をかけてみましょう。1700年の情報だいけを検索したい時は

grep "17[1234567890][1234567890]" n.txt

と検索すれば、「17○○」に該当する文章がマッチします。

[0-9][a-z][A-Z]は数字、アルファベットのいずれか1文字

先ほど0から9までの数字どれか1つと一致させる時、下の様に書きました。

[1234567890]

これを短く表すと

[0-9]

です。これは0から9までの文字という意味になり、0〜9の数字いずれか1文字とマッチします。

同様に英字も

[a-z]

とすれば、アルファベットのaからzまでのいずれか1文字にマッチする様になります。先ほどの検索を短縮系を使って検索してみましょう。

grep "17[0-9][0-9]" n.txt

同じ結果がでたでしょ。

ひらがな、漢字、カタカナも省略系もある

数字、1文字を[0-9]を用いて簡単に検索できました。

この省略系は日本語にも対応しています。

いずれかの漢字1文字と一致させるには

[亜-熙]

ひらがなは

[ぁ-ん]

です。「ぁ」が小文字の「ぁ」になっている事に気をつけてください。

カタカナは

[ァ-ン]

です。同じ様に、「ァ」が小文字の「ァ」になっている事に気をつけてください。

では試しに、いづれかの「[数字][数字][漢字]」という検索をしてみましょう。
これに一致するのは「27年」とか「30日」とかになります。

grep “[0-9][0-9][亜-熙]” n.txt

ただし、日本語の場合はunixの文字コードとファイルの文字エンコーディングが一致していないと、うまくいかないようです。

例えば、macターミナルの文字コードがUTF-8でファイルがShift-JISだと、検索しても出てきません。

この場合はファイルをUTF-8に変換して、grepしてあげましょう。

[^]は指定した文字、1文字の否定

さきほど、[0-9]は0から9までのどれかと解説しました。[^0-9]とすると、0から9以外の何か1文字という表現になります。

例えば、「1700年」意外の年、のデータを取得したい場合はこのようになります。

grep “1[^7][0-9[0-9]年” n.txt

( )は文字をグールプ化する

前回説明したように、grepでは論理式の「OR」を表すのに縦棒を使いますが、縦棒の前には\バックスラッシュがつきます。

\|

同じ様に、unixのgrepでは小括弧( )の前にバックスラッシュがつきます。

\(グループ化したい文字\)

という風に書きます。

文字をグループ化するとは、例えば、「数字1つと年、月、日、歳のどれか」をマッチさせたい時に、使用します。

grep "[0-9]]\(年\|月\|日\|歳\)" n.txt

数字とその後に年月日歳のいずれかがついた文字が表示されると思います。

今回のまとめ

今回は正規表現で重要となる括弧の使い方を見てきました。これと、前回のを足し合わせるだけで、6割の検索はできるようになります。

スポンサードリンク

「為になったなぁ」と思ったら、シェアお願いします。

-unix, プログラミング
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連記事

railsのaws-sdk gemを使ってs3に画像ファイルをフォームからアップロードする

概要 みなさんこんにちはcandleです。比較的難しいrailsからs3に画像をアップロードする方法を試してみましょう。 一般にサーバ環境にはスケーラビリティ(アクセスの規模に応じて、動的にサーバを動 …

ruby on railsで出力されるlog(ログ)のフォーマットを変更する

概要 みなさんこんにちはcandleです。今回はrailsのログに関する記事です。railsは決まった記述でログを出力します。 webアプリケーションを実行中におかしな挙動が合った場合はこのログをもと …

emacsの設定環境を作る[.emacs , .emacs.d]

概要 どうもみなさんcandleです。今回はemacsの設定環境を作っていきましょう。 設定環境って造語です。 emacsはデフォルトでも十分使えますが、プラグインを加えたり設定を増やすことでより使い …

fabricでmysqlコマンドを実行する関数を自作する

概要 皆さんこんにちはcandleです。今回はfabricからリモート先のサーバのmysqlを実行するための環境変数と関数を作成したいと思います。 mysqlは一般にmysqlコマンドをログインしてか …

basscss v8以降にv7以前のスタイルを追加する(自分用メモ)

概要 みなさんこんにちはcandleです。今回はbasscssのv8でかなりデフォルトのスタイルから削除されてしまったスタイルをインポートします。 v7以降からbasscssのスタイルはかなり分割され …

  • English
  • 日本語

ベンチャー企業のCTOをやってます。大学時代にプログラミングを始め、javaから入門し、C++へて、PHPへと進み、会社ではRailsを使用。自動化が大好きなプログラマー