![grep を使用して数字を含むフォルダをフィルタリングする](https://rvso.com/image/1618326/grep%20%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E6%95%B0%E5%AD%97%E3%82%92%E5%90%AB%E3%82%80%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%E3%83%95%E3%82%A3%E3%83%AB%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B.png)
数字でフィルタリングしたフォルダのみを一覧表示しようとしていましたls -1
(オプション-1
は1行に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
これに と を加えるだけrm
でsudo
、あなたのキャリアを劇的に変えるような経験を得ることができます。