![Bashの正規表現の問題:[^negate]が機能しないようです。](https://linux33.com/image/30484/Bash%E3%81%AE%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%AE%E5%95%8F%E9%A1%8C%EF%BC%9A%5B%5Enegate%5D%E3%81%8C%E6%A9%9F%E8%83%BD%E3%81%97%E3%81%AA%E3%81%84%E3%82%88%E3%81%86%E3%81%A7%E3%81%99%E3%80%82.png)
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 m
grepを使用する必要があります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
と一致するのでcharlie
、delta
これらだけが印刷されます。
答え2
私の考えでは、そのgrep -v
ロゴはあなたが望むように動作するようです。 ~からマニュアルページ:
-v, --invert-match
Invert the sense of matching, to select non-matching lines.
これを使用して、ls /directory | grep -v [term]
一致しない行を印刷できます。