あなたがしたいことが起こっていると確信していますか?実行ls /directory | grep '[^term]'
すると、基本的に文字ter mではなくgreppingになります。つまり、ファイルの名前に他の文字が含まれている場合でも、の出力には表示されます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
すべてのファイルに文字クラスに含まれていない文字が少なくとも1つあったため、ディレクトリリスト全体が含まれていることに気づいた場合。
したがって、Kanvuanzaが言ったように、「term」の逆をgrepするには、t e r m
を使用して文字を実行する必要があります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
termで始まる行にしたいですか。または、用語をまったく含まない行をgrepしたいですか?