grep を使用して数字を含むフォルダをフィルタリングする

grep を使用して数字を含むフォルダをフィルタリングする

数字でフィルタリングしたフォルダのみを一覧表示しようとしていましたls -1(オプション-11行に1つのファイルをリストする) を grep で実行します (find でも実行できることは知っていますが、この例では grep のみを使用します)

フォルダは

PC:test user$ ls -1
1184
36
69929
7
9907

さまざまな出力で得られるのは次のようになります...

これ: 9907 がなぜそこに含まれているのかわかりません。1 桁の 7 のフォルダーだけが含まれているのが理にかなっているように思えますが?

PC:test user$ ls -1 | grep [0-9]
7
9907

7 が欠けています。2.以上を意味しますか?

PC:test user$ ls -1 | grep [0-9].
1184
36
69929
9907

これは、そこに含まれる数字とすべて一致することを意味しますか?

PC:test user$ ls -1 | grep [0-9].*
1184
36
69929
7
9907

引用符で囲むと期待どおりに動作しますが、なぜでしょうか? これは と同等ですか[0-9].*?

PC:test user$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

答え1

「ファイル名の置換」または「パス名の拡張」または「グロビング」

コマンドを入力すると、いくつかの段階の潜在的な変換が行われます。前に任意のプログラム (grep など) が呼び出されます。

[は、一部のシェルでは特殊文字です。

$ echo [0-9]
7

ここで起こっていることは、シェルがファイル名の選択として 0 ~ 9 を展開し、「7」のファイルを見つけて、「7」を grep に渡しているのではないかと思います。したがって、grep はファイル名のどこかに「7」が含まれているファイル名を検索します。

[シェルではなく grep で処理したい場合は、文字列を引用符で囲むか、シェルを騙して表現を別の方法で解析させる必要があります。

$ echo [0-9].
[0-9].

引用をお勧めします。

man bash ( を参照for)、man testおよび151ページも参照これ


正規表現

正規表現では、.は「任意の 1 文字」を意味します。つまり、任意[0-9].の数字の後に 1 文字が続くことを意味します。ファイル名には7後者がありません。


grepで1桁のファイル名を検索するには、式を行の先頭と末尾の両方に固定する必要があります。

$ ls -1 | grep '[0-9]'
1184
36
69929
7
9907

$ ls -1 | grep '^[0-9]$'
7

あっ、パソコン壊しちゃった

特殊文字を不注意に使用すると、さまざまな刺激的な結果につながります

$ ls -1 > x
$ grep *
x:1184

これは、次の点を考慮するとより明確になるはずです。

$ ls -1
1184
36
69929
7
9907
x

$ echo *
1184 36 69929 7 9907 x

これに と を加えるだけrmsudo、あなたのキャリアを劇的に変えるような経験を得ることができます。

関連情報