gnu grep が使える環境なら、素直にgnu grep を使おう
新規にターミナル(端末)を開きます。ubuntu系は以下を同時押し。CTRL+ALT+TPCRE(Perl正規表現互換オプション)
grep -P '検索文字列' ↲
エクスペリメンタルな位置づけも終わっていますので安心です。サブセットかと思っていたら、(否定|肯定)(先読み|後読み)も使えますよ。グッドです。
gnu grepが使えない環境では、pcre2grep/pcregrep がありますが、あんまり使いませんね。
おおむね、grepの -Pオプション(大文字です。小文字にしても怒られるだけなのですぐに気が付きます)でだいじょうぶ。
おおむね、grepの -Pオプション(大文字です。小文字にしても怒られるだけなのですぐに気が付きます)でだいじょうぶ。
私の場合、ほとんど日本語処理目的なのですが自分の用途では困ったことがないですね。
Perlのワンライナーの一例
perl -ne "print if /検索文字列/" ファイル ↲
grepの色分け機能などを実装するのはたいへんですから、素直にGNU Grepがよいです。
grepの色分け機能などを実装するのはたいへんですから、素直にGNU Grepがよいです。
MACはGNU grepではないらしいので、pcregrep/pcre2grepが良いのではないでしょうか。
私はカジュアルなLinux使いなので、深いことは気にしません。笑) pcre2grepで統一してもいいかもしれません。
方針としては、できるだけ簡素に、学習することなく、空気のように端末を扱うです(努力だけはしたくない)。だから、正規表現はPerl互換の正規表現だけが原則です。プロの方は瞬時に脳みそ切替しながら使うのかもしれませんけれど。
perl 5 互換の正規表現を利用する grep ユーティリティ pcregrepをいれたい場合。
ubuntu/mint
導入する
sudo apt install pcregrep ↲
削除する
sudo apt purge pcregrep ↲
...
きょう現在、当方にはいっているgrep
pcre2grep version 10.21 2016-01-12
pcregrep --version ↲
pcregrep version 8.38 2015-11-23
zgrep (gzip) 1.6
Copyright (C) 2010-2013 Free Software Foundation, Inc.
grep --version ↲
grep (GNU grep) 2.25
Copyright (C) 2016 Free Software Foundation, Inc.
複数行にわたるgrepの例
Perlのワンライナーのほうが楽だよねといわれそう
perlのワンライナーのほうが楽だけど、grepでもちょろいので知っていて損はないという例。
こういうファイル。9行。
cat -n delete.txt
1 会いたい
2 藍Ⅰ姶
3 藍と愛と藍
4 藍藍
5 藍藍青
6 群青
7 藍藍
8 藍と終と
9 藍マイ。
マッチした範囲に色。色がなければ無能。
$ grep -Pz '愛.*(\n|.)*終' delete.txt ↲
会いたい
藍Ⅰ姶
藍と愛と藍
藍藍
藍藍青
群青
藍藍
藍と終と
藍マイ。
※zオプションで行単位処理でなくなり、
(\n|.)で改行またはなんかの1文字にマッチさせる。
perlでいえば、セパレータ変えての/smオプションってことですね。
範囲切り出し::オススメなo オプション、有能
$ grep -Pzo '愛.*(\n|.)*終' delete.txt ↲
愛と藍
藍藍
藍藍青
群青
藍藍
藍と終
含まれている行を表示
$ pcre2grep -M '愛.*(\n|.)*終' delete.txt ↲
藍と愛と藍
藍藍
藍藍青
群青
藍藍
藍と終と
$ pcregrep -M '愛.*(\n|.)*終' delete.txt ↲
藍と愛と藍
藍藍
藍藍青
群青
藍藍
藍と終と
マニュアルで詳細は確認してください。
pcre2grepの動作をperlでやるとすれば、範囲を抜き出すかんじ。
perl -nle 'print if /愛/ ... /終/' delete.txt ↲
cat -n delete.txt
1 会いたい
2 藍Ⅰ姶
3 藍と愛と藍
4 藍藍
5 藍藍青
6 群青
7 藍藍
8 藍と終と
9 藍マイ。
マッチした範囲に色。色がなければ無能。
$ grep -Pz '愛.*(\n|.)*終' delete.txt ↲
会いたい
藍Ⅰ姶
藍と愛と藍
藍藍
藍藍青
群青
藍藍
藍と終と
藍マイ。
※zオプションで行単位処理でなくなり、
(\n|.)で改行またはなんかの1文字にマッチさせる。
perlでいえば、セパレータ変えての/smオプションってことですね。
範囲切り出し::オススメなo オプション、有能
$ grep -Pzo '愛.*(\n|.)*終' delete.txt ↲
愛と藍
藍藍
藍藍青
群青
藍藍
藍と終
含まれている行を表示
$ pcre2grep -M '愛.*(\n|.)*終' delete.txt ↲
藍と愛と藍
藍藍
藍藍青
群青
藍藍
藍と終と
$ pcregrep -M '愛.*(\n|.)*終' delete.txt ↲
藍と愛と藍
藍藍
藍藍青
群青
藍藍
藍と終と
マニュアルで詳細は確認してください。
pcre2grepの動作をperlでやるとすれば、範囲を抜き出すかんじ。
perl -nle 'print if /愛/ ... /終/' delete.txt ↲
PCRE2grepとPCREgrepの違い
前者が新しい10系列以降になります。後者はメンテされていますが8系列です。ubuntu標準では8系列です。自分がどうやってpcre2grepをいれているのかは思い出せません。コンパイルしたのでしょうね。PCREプロジェクトはケンブリッジ大学発祥のようです。
Cf. http://www.pcre.org PCRE - Perl Compatible Regular Expressions