web-dev-qa-db-ja.com

grepの数列のマッチング

だから私は年番号のシーケンスをgrepと一致させようとしていますが、これは簡単なはずです。単純な正規表現が機能していないことに少し困惑しています。

私がやっていることは、いくつかのファイルをアーカイブするツールを実行していますが、ファイルを正しいディレクトリに配置するには、ファイルの日付を確認する必要があります。私はすでに適切にフォーマットされた入力を持っています。

<span class='t-d'>1994-Oct-28</span>

これはほんの一例です。これがある場合は、1994年の部分だけを取得し、これを使用して正しい年にアーカイブを続けたいと思います。私はこのようなもので十分だと思っていました:

grep -o '[0-9]{4}'

しかし、これは何にも一致しないようです。私が次のようなことを試みるとき:

grep -o '[0-9]'

すべての個別の番号に一致するため、1 9 9 42および8です。

したがって、私の構文は間違っていますが、私の知識では、これは0から9の数に4回一致し、{}は範囲または正確な範囲のいずれかで長さを指定します。誰かがこの単純な構文で私を助けてくれるなら、それは非常にありがたいです。

4

{4}extended正規表現 です。 -Eオプションを指定しない限り、grepはそれを理解しません。

-E, --extended-regexp
       Interpret PATTERN as an extended regular expression (ERE, see below).  (-E is specified by POSIX.)

で試してみてください

grep -E '[0-9]{4}'

$ echo abcd1234abcd | grep -o -E '[0-9]{4}'
1234

[:digit:]文字クラスを使用して、シンボルの順序が異なる可能性があるロケールの問題を回避することもできます。

$ echo abcd1234abcd | grep -o -E '[[:digit]]{4}'
1234

何らかの理由で拡張正規表現を使用したくない場合は、次を使用できます。

grep -o '[0-9][0-9][0-9][0-9]'
5
Matteo