web-dev-qa-db-ja.com

Grepが機能しないワイルドカードを除外する

Ubuntu 14.04 LTSを使用しています。

私はgrepで遊んでいますが、grepをlsにパイピングする問題にぶつかりました。すべての例は、再帰的ではない現在のディレクトリに限定されています。

名前に数字を含むすべてのファイルを一覧表示する場合:

ls | grep [0-9]

最初の文字として「d」、「h」、「m」を含むすべてのファイルをリストしたい場合:

ls | grep ^[dhm]

最初の文字として数字を含むすべてのファイルを一覧表示する場合:

ls | grep ^[0-9]

ただし、!内で[]を使用しようとすると、!は含まれません。

user@Host:~$ ls | grep [0-9]
1.log
2.log
3.log
hs_err_pid4015.log
Untitled 1.odt
v1.odt

user@Host:~$ ls | grep [!0-9]
1.log
2.log
3.log
hs_err_pid4015.log
Untitled 1.odt
v1.odt

^で使用しようとした場合も同じです

user@Host:~$ ls | grep ^[0-9]
1.log
2.log
3.log

user@Host:~$ ls | grep ^[!0-9]
1.log
2.log
3.log

Grepやワイルドカードに関する他の投稿、マニュアルページ、記事などを読むのに数日費やしましたが、わかりません。 'などのワイルドカードフラグ("^)の両方を組み合わせて、![[]]に入れてみました。

上記の例と異なる出力を示すものはありません。

解決策を見せないでください。私の間違いを説明し、自分でそれを理解させてください。

2
Iliyan Stankov

否定の文字クラス内の正規表現トークンは、^ではなく!です。

必要なもの:

ls | grep '^[^0-9]'

ls | grep ^[!0-9]を実行すると、[]内で、!がそのまま処理され、0-9が通常の方法で展開されます。

また、この種の些細なタスクには、シェルグロビングを使用します。正規表現はこれらには少なすぎます。また、ls;を解析しません。あなたは単にすることができます:

ls [^[:digit:]]*
ls [![:digit:]]*

bashは、グロビング中に文字クラス内のパターン否定トークンとして^!の両方をサポートすることに注意してください。

あなたに依存したくない場合locale

ls [^[0-9]]*
ls [![0-9]]*
5
heemayl