-6

我有两个文件,即abc_0123_4567.datAug 3创建和abc_0012_0043.datAug 14创建。

当我们ls -ltra在 shell 中输入时,我们得到

-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中间有两个空格,中间Aug 14有一个空格。

我希望在 perl 中使用与 shell 命令相同的空格进行编码时看到相同的结果。

4

3 回答 3

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 的可能数字,以及一个任意大小的确定数字。

于 2012-08-16T15:16:19.963 回答
1

如果您试图获取一堆文件的修改日期,那么使用 stat 运算符返回的 mtime 比解析 ls 的输出要好得多。

这将是一个数字,您可以使用 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 回答