あなたが書いたとおりに動作しています:
grep '[0-9]\{3,5\}' - Is there 3 to 5 sequential numeric characters in this string?
文字列が の場合、1234567891234
そこに 3 ~ 5 個の数字を含むサブ文字列があります。
3 文字から 5 文字の数字のみを含み、5 文字以下の文字列のみに関心がある場合は、正規表現にいくつかの境界を設定する必要があります。-E
正規表現の最新バージョンを使用するフラグも使用する必要があります。
$ echo 12345678901234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"
これは何も出力しませんが、次のようになります。
$ echo 1234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"
この:
$ echo 12345aaa6789aaa01234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"
最初のもの(^|[^0-9])
は、行の先頭 (それが先頭です^
)、または文字 0-9 以外のいずれかを示します。(それは[^0-9]
です)。(...|...)
拡張正規表現でを使用すると、左側の式または右側の式のいずれかを意味します。同じことが、([^0-9]|$)
非数値または行末のいずれかを示す末尾にも当てはまります。
真ん中はあなたです[0-9]{3,5}
(拡張式にバックスラッシュは必要ありません)。これは、3桁から5桁の間です。そして、どちらの側も数字以外、または文字列の最初または最後にバインドされているため、これはあなたが望むことを行います.
いくつかのこと:
$ echo 12345aaa6789aaa01234 | grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)"
と
$ grep -E "(^|[^0-9])[0-9]{3,5}([^0-9]|$)" <<<"12345aaa6789aaa01234"
ほとんど同じことを意味します。ただし、実行する必要があるプロセスは 1 つだけで、パイプがないため、2 番目の方法の方が効率的です。さらに、入力するのが短くなります。
また、文字クラスを使用できます (使用することをお勧めします)。
$ grep -E "(^|[^[[:数字:]])[[:数字:]]{3,5}([^[:数字:]]|$)"<<<"12345aaa6789aaa01234"
これにより、ラテン英数字を使用する場所にいなくても、正規表現が機能します。\d
は と同じクラスであるため、これは同じことを行うためのより短い方法です[:digit:]
。
$ grep -E "(^|[^\d])\d{3,5}([^\d]|$)"<<<"12345aaa6789aaa01234"