-6

abc_0123_4567.datつまり、8 月 3 日abc_0012_0043.dat作成されたファイルと8 月 14 日に作成された2 つのファイルがあります。

ls -ltraシェルに入力すると、

-rw-r--r--   1 user  sample   640578  Aug  3  03:15  abc_0123_4567.dat
-rw-r--r--   1 user  sample   488542  Aug 14  03:20  abc_0012_0043.dat

使用ls -ltra abc* | grep "Aug 3" すると表示されます

-rw-r--r--   1 user  sample   640578  Aug  3  03:15  abc_0123_4567.dat

日付で見ることができAug 3、間に 2 つのスペースがあり、間Aug 14に 1 つのスペースがあります。

シェル コマンドと同じように、正確なスペースを使用して perl でコーディングした場合と同じ結果を確認したいと考えています。

4

3 に答える 3

2

あなたが求めているのは、1桁と2桁の両方のケースを取る正規表現だと思います。

まず、実際にスペースの数を気にしない場合は、次のようにすることができます。

qr/ ( \b        # At word boundary
      (?:Jan|Feb|Mar|Apr|May|Ju[ln]|Aug|Sep|Oct|Nov|Dec) # 3-letter months
      [ ]{1,2}   # minumum 1, maximum 2 spaces
      \d{1,2}    # minumum 1, maximum 2 digits
    )
   /x;

しかし、これにより'Aug..14'(where '.'-> ' ') が許可されます。

第二に、より厳密な仕様が必要な場合は、次のようにすることができます

qr/ ( \b        # At word boundary
      (?:Jan|Feb|Mar|Apr|May|Ju[ln]|Aug|Sep|Oct|Nov|Dec) # 3-letter months
      [ ]       # exactly one space
      [ 123]    # it's a *date* after all
      \d        # ending with a digit
    )
   /;

したがって、3 文字のシーケンス、1 つの明確なスペース、1 つのスペースまたは 3 以下の数字、および任意のサイズの 1 つの明確な数字が得られます。

于 2012-08-16T15:16:19.963 に答える
1

一連のファイルの変更日を取得しようとしている場合は、ls の出力を解析するよりも、stat 演算子によって返された mtime を使用する方がはるかに優れています。

localtime() 演算子を使用して日付フィールドに分割できる数値になります。

ls 出力の解析は、ほとんどの場合正しいことではありません。

于 2012-08-16T17:39:52.910 に答える
0

正規表現は常に正確なスペースに一致します。

ls -ltra abc* | perl -nE "print if /Aug  3/"

以下とほとんど同じです:

ls -ltra abc* | grep "Aug  3"
于 2012-08-16T14:49:39.013 に答える