我有两个文件,即{em> 8月3日创建的abc_0123_4567.dat
和 8月14日创建的abc_0012_0043.dat
。
当我们在shell中输入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
中间有两个空格,Aug 14
之间有一个空格。
我希望在perl中使用与shell命令一样的精确空格进行编码时看到相同的结果。
答案 0 :(得分: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'
('.'
- > ' '
),如果这种情况发生的话。
其次,如果您想要更严格的规范,可以执行以下操作
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)
如果您正在尝试获取一堆文件的修改日期,那么使用stat运算符返回的mtime比解析ls的输出更好。
这是一个数字,您可以使用localtime()运算符将其分解为日期字段。
解析ls输出几乎不是正确的事情。
答案 2 :(得分:0)
正则表达式始终与精确空格匹配:
ls -ltra abc* | perl -nE "print if /Aug 3/"
几乎完全相同:
ls -ltra abc* | grep "Aug 3"