如何在正则表达式中构造它

时间:2009-07-08 14:48:59

标签: regex

我的文件名以yyyymmdd结尾,例如:myFile.20090601,myFile20090708等

我想在2009年6月8日至7月7日的所有文件中找到一个模式,即:20090609到20090707

如何一次性完成正则表达式?

我试过了:

grep 'myPattern' *20090(6(09|[1-3][0-9])|70[1-7])

4 个答案:

答案 0 :(得分:4)

20090(6(09|[1-3][0-9])|70[1-7])$

20090(6(0[89]|[1-3][0-9])|70[1-7])$

取决于你是指7月8日还是9日(你的问题似乎与此相矛盾)。

答案 1 :(得分:2)

grep 'myPattern' `ls | grep -E "20090(6(09|[1-3][0-9])|70[1-7])"`

这大致如下。获取当前目录(ls)中的文件列表,使用日期正则表达式(ls | grep ...)对其进行过滤,然后使用您的模式在生成的文件列表上执行grep搜索({ {1}})。 grep 'myPattern' ...周围的反向标记执行命令的该部分,并将该命令的输出替换为周围的命令。因此,如果它产生类似“ls | grep ...”的输出,那么它将产生类似file1 file2 file3的命令。

答案 2 :(得分:1)

我建议使用带有3个参数的perl / python脚本(或任何其他脚本语言):

  1. 模式
  2. 开始日期为yyyymmdd
  3. 结束日期为yyyymmdd
  4. 它会:

    1. 解码开始和结束日期。
    2. 循环浏览文件夹中的文件
    3. 解码文件名中的任何日期
    4. 检查是否在日期之间,以及grep模式

答案 3 :(得分:0)

有效日期的范围是6月的06-30和7月的01-07。由于天数不同,我们应该每个月使用单独的正则表达式。这些是

/2009 06 (09 | [12][0-9] | 30)/x

(请注意日期范围如何根据十位进行划分,因为对于单位所依据的有效内容有不同的条件。)

/2009 07 0[1-7]/x

然后我们可以将它们加入

/(2009 06 (09 | [12][0-9] | 30)) | (2009 07 0[1-7])/x

然后分解公共点(可能不是最好的可读性)并添加行尾断言:

/2009 0 (6 (09 | [12][0-9] | 30)) | (7 0[1-7]) $/x