grepで単純な正規数量子式を使用する

grepで単純な正規数量子式を使用する

ls | xargs -n 1 basename | grep -E '[0-9]{1}'なぜ0〜9の間の単一の数字しか表示されないのを知っている人はいますか?

たとえば、次のような場合があります。

touch 1
touch 22
touch 333
touch test_file

私が実行した場合ls | xargs -n 1 basename | grep -P '[0-9]{1}'

1、22、333個のファイルがリストされています。

私が実行した場合ls | xargs -n 1 basename | grep -P '[0-9]{2}'

22個と333個のファイルがリストされています。

私は{2}が22個のファイルのみを表示したいと思います。

ベストアンサー1

私の考えでは、あなたが現在起こっているものとは異なることを期待する理由は、あなたが受け入れているからだと思います。

[0-9]{n}

これは[0-9]のn個の文字だけを一致させ、残りは捨てることを意味しますが、実行する操作は[0-9]のn個の文字を見つけて一致と呼ぶことです。だから

[0-9]{1}

いつでも[0-9]と一致する項目を正確に探すので、1つは一致し、22個を確認すると最初の2つで止まり、残りは見ずに一致すると思います。 333も同じだ。指定した場合

[0-9]{2}

1つに一致せず、22のゲームと一致し、次に333のゲームのうち33のゲームと一致するのでインポートします。

slmが言ったように、ここでは単語の境界が重要です。あなたの質問に一致するgrep正規表現には、-Pスタイルと-Eスタイルの両方があります。次のように、-EでGNU \ <と\>を使用できます。

ls | xargs -n 1 basename | grep -E '\<[0-9]{1}\>'

または \b は、次のように -E または pcre -P と一致します。

ls | xargs -n 1 basename | grep -P '\b[0-9]{1}\b'

おすすめ記事