GNU/Linux >> Linux の 問題 >  >> Linux

Bash の正規表現の問題:[^negate] が機能しないようです

ls /directory | grep '[^term]' を実行したとき あなたは本質的に、文字 t e r m ではなく grep しています。これは、ファイルの名前に他の文字が含まれている場合でも、 ls の出力に表示されることを意味します .たとえば、次のディレクトリを見てください:

$ ls
alpha  brave  bravo  charlie  delta

ls |grep '^[brav]' を実行すると 以下を取得します:

$ ls |grep '^[brav]'
alpha
brave
bravo

ご覧のとおり、brave を取得しただけではありません と bravo alpha も取得しました 文字クラス [] のため そのリストから任意の文字を取得します。

したがって、 ls |grep '[^brav]' を実行すると 文字を含まないすべてのファイルを取得します b r a v どこでも

$ ls |grep '[^brav]'
alpha
bravo
brave
charlie
delta

すべてのファイルに少なくとも 1 あるため、ディレクトリ リスト全体が含まれていることに気付いた場合 文字クラスに含まれていなかった文字。

Kanvuanza が言ったように、t e r m という文字ではなく、"term" の逆を grep するには grep -v を使用して行う必要があります .

例:

$ ls |grep -v 'brav'
alpha
charlie
delta

また、クラスに文字が含まれていないファイルが必要ない場合は、 grep -v '[term]' を使用します .これにより、これらの文字を含むファイルが表示されなくなります。 (カンヴァンザの答え)

例:

$ ls |grep -v '[brav]'

ご覧のとおり、このディレクトリ内のすべてのファイルにそのクラスの文字が少なくとも 1 つ含まれていたため、リストされたファイルはありませんでした。

補遺:

PCRE を使用すると、正規表現だけを使用して、否定式を使用して除外できることを付け加えたいと思います。これを行うには、否定先読み正規表現と呼ばれるものを使用します:(?!<regex>) .

したがって、上記の例を使用すると、 grep を使用せずに、次のようなことを行って必要な結果を得ることができます

$ ls | grep -P '^(?!brav)'
alpha
charlie
delta

その正規表現を分解するには、最初に ^ 行の先頭に一致します brav に一致しない文字列を探します 後を追うこと。 alphaのみ 、 charlie 、および delta 一致するので、それらだけが印刷されます。


grep -vだと思います フラグはあなたが望むことをします。マニュアルページから:

-v, --invert-match
    Invert the sense of matching, to select non-matching lines.

ls /directory | grep -v [term] を使用できます 一致しない行を印刷します。


Linux
  1. 正規表現:すべてをまとめる

  2. Bash +正規表現で名前を確認しますか?

  3. Bash:置換の正規表現?

  1. grepの基本

  2. 6 Bash 条件式の例 ( -e, -eq, -z, !=, [, [[ ..)

  3. Rust ツールチェーンを Docker にインストールすると、Bash の「source」コマンドが機能しません

  1. Bash `(())` が `[[]]` 内で動作しないのはなぜですか?

  2. Bashで二重文字を見つけるための正規表現

  3. sed による正規表現