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

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

Bashで実行すると、コマンドが無視されたかのls /directory | grep '[^term]'ように一般的なリストが表示されます。grep私は同じことを試してみたが、egrep二重引用符と一重引用符を使用してみましたが、より良い結果はありませんでした。試してみると、ls /directory | grep '^[term]期待どおりにtermで始まるすべてのエントリを取得します。

オンラインエディタでこのコマンドを試しましたが、次のようにできます。私の正規表現テスト正常に動作しました。しかし、Bashではそうではありません。したがって、シミュレーションでは動作しますが、実際の生活では動作しません。

私はCrunchbang Linux 10を使用しています。これは十分な情報であり、すべてのヒントを期待しています。このような基本的なレベルでは実行できず、時間を無駄にするのは本当に苦しいからです!

ベストアンサー1

あなたが望むことが実際に起こっていますか?実行すると、ls /directory | grep '[^term]'本質的に文字用語mを探しています。これは、ファイル名に他の文字が含まれていても、まだ表示されることを意味しますls。次のディレクトリを例に挙げます。

$ ls
alpha  brave  bravo  charlie  delta

今実行すると、ls |grep '^[brav]'次のようになります。

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

ご覧のとおり、私が取得するだけでなく、brave文字クラスがそのリストから文字を取得するために取得するbravoこともできます。alpha[]

したがって、実行すると、ls |grep '[^brav]'brav文字を含まないすべてのファイルが取得されます。どこかに名前で。

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

すべてのファイルに少なくとも一つ文字クラスに含まれない文字です。

Kanvuanzaが言ったように、文字ではなく「用語」の反意語を見つけるためにgrepするには、t e r mgrepを使用する必要がありますgrep -v

たとえば、

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

また、ファイルにクラスの文字が含まれないようにするには、を使用しますgrep -v '[term]'。これにより、その文字を含むファイルが表示されなくなります。 (Kanwanzaの回答)

たとえば、

$ ls |grep -v '[brav]'

ご覧のとおり、このディレクトリ内のすべてのファイルにはこのクラスの1つ以上の文字が含まれているため、ファイルは一覧表示されません。

付録:

PCREを使用すると、正規表現のみを使用して否定的な表現を使用するコンテンツをフィルタリングできることを追加したいと思います。これには、負の予測正規表現を使用できます(?!<regex>)

したがって、上記の例では、フラグを使用せずに目的の結果を得るために同様の操作を実行できますgrep

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

この正規表現を分解するには、まず行の先頭に一致し、次に一致しない^文字列を見つけますbrav。 Onlyalphaと一致するのでcharliedeltaこれらだけが印刷されます。

おすすめ記事