はじめに
grepで-v
オプション使わないで文字列を含まない行を出す方法です。この方法を覚えておくとサクラエディタや秀丸の正規表現にも使え、複雑なフィルターができます。
使用例
こんなファイルがあったとします。
$ ls -1 messages-20230703.gz messages-20230704.gz messages-20230705.gz messages-20230706 messages
これをgrepで圧縮ファイル(gz)以外を表示したいときの正規表現の使いかたです。でポイントとして、
- -Pオプションを使う
- シングルクォートで囲む
- 含めたくない文字は(?! )の中に入れる。そのときに行全体に書かかるような書きかたが必要です。今回だと
(?!gz$)
と書くと思った結果にならず(?!.*gz$)
と、gzの前に.*
をつけると表示されます。*1
$ ls -1 | grep -P '^messages(?!.*gz$)' messages messages-20230706
本当に正しい書き方は
$ ls -1 | grep -P '(?=^messages)(?!.*gz)' messages messages-20230706
ちなみに圧縮ファイル以外のファイル名に規則性があれば
$ ls -1 | grep -P '^messages$|messages-[0-9]{8}$' messages messages-20230706
以上
*1:理屈はあるのですが自分でも理解しきれてないので省略