gnu grep が使える環境なら、素直にgnu grep を使おう
新規にターミナル(端末)を開きます。CTRL+ALT+T
#PCRE(Perl正規表現互換オプション)
grep -P '検索文字列'
エクスペリメンタルな位置づけも終わっていますので安心です。サブセットかと思っていたら、(否定|肯定)(先読み|後読み)も使えますよ。グッドです。ただひとつ、Perl5な場合では文字数の限定などがあるので、ちょっと不便ですね。
gnu grepが使えない環境では、pcre2grep/pcregrep がありますが、あんまり使いません。
おおむね、grepの -Pオプション(大文字です。小文字にしても怒られるだけなのですぐに気が付きます)でだいじょうぶ。
おおむね、grepの -Pオプション(大文字です。小文字にしても怒られるだけなのですぐに気が付きます)でだいじょうぶ。
私の場合、ほとんど日本語処理目的なのですが自分の用途では困ったことがないです。
#Perlのワンライナーの一例
perl -lne "print if /検索文字列/" ファイル
perl -lnE "say if /検索文字列/" ファイル
perl -lnE " /検索文字列/ and say" ファイル
grepの色分け機能などを実装するのはたいへんですから、素直にGNU Grepがよいです。
改行がかならず必要なら、say で書いていったほうがタイプ数が少ないです。
当職はトラブった時しか考えないのですが、クオートはシングルが基本なので、
見本は不適切ってことかもしれません。直せよ。^^;
perl -lnE "say if /検索文字列/" ファイル
perl -lnE " /検索文字列/ and say" ファイル
grepの色分け機能などを実装するのはたいへんですから、素直にGNU Grepがよいです。
改行がかならず必要なら、say で書いていったほうがタイプ数が少ないです。
当職はトラブった時しか考えないのですが、クオートはシングルが基本なので、
見本は不適切ってことかもしれません。直せよ。^^;
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