如何在bash中匹配模式的零个或多个实例?

时间:2015-02-08 21:04:33

标签: regex bash shell grep

我正在尝试遍历一堆文件前缀,寻找与每个文件中给定模式匹配的单行。我已经提取并概括了几个例子,并在下面使用它们来说明我的问题。

我搜索了一行可能在开头有一些空格,然后是数字1234,可能还有一些空格,然后是数字98765.我知道感兴趣的文件以l76.logsheet开头,我想要从文件中提取以一个或多个数字结尾的行。但是,我想确保排除以其他任何内容结尾的文件(其中有太多选项可以合理地使用grep --exclude选项)。这是我从tcsh shell中做到的方式:

tcsh% grep -E '^\s{0,}1234\s+98765' l76.logsheet[0-9]{0,}
l76.logsheet10:1234   98765       y  13:02:44     2

这是另一个例子,我再次搜索98765,但前面有不同的数字和不同的文件前缀:

tcsh% grep -E '^\s{0,}4321\s+98765' k43.logsheet[0-9]{0,}
k43.logsheet1:  4321    98765 y    13:06:38    14

效果很好,只返回我需要的东西。

我的问题在于bash shell。重复相同的命令会返回一个相当有趣的结果。第一行没有问题:

bash$ grep -E '^\s{0,}1234\s+98765' l76.logsheet[0-9]{0,}

返回:

l76.logsheet10:1234   98765       y  13:02:44     2

但第二个例子的结果只在文件名的末尾有一个数字。这会导致bash在提供正确结果之前抛出错误:

bash$ grep -E '^\s{0,}4321\s+98765' k43.logsheet[0-9]{0,}
grep: k43.logsheet[0-9]0: No such file or directory
k43.logsheet1:  4321    98765 y    13:06:38    14

我的问题是,如何从bash shell中搜索以前一个模式的零个或多个结尾的文件?我有一个工作,但我正在寻找这个问题的实际答案,这可能会节省我(希望其他人)将来的时间。

1 个答案:

答案 0 :(得分:3)

首先,确保设置extglob

shopt -s extglob

现在,我们可以使用*(...)匹配任何模式的零个或多个。例如,让我们创建一些文件并匹配它们:

$ touch logsheet logsheet2 logsheet23 logsheet234
$ echo logsheet*([0-9])
logsheet logsheet2 logsheet23 logsheet234

文档

根据man bashbashextglob提供了以下功能:

  

?(模式列表)
     匹配给定模式的零次或一次

     

*(模式列表)
                       匹配给定模式的零次或多次出现

     

+(模式列表)
                匹配给定模式的一次或多次出现

     

@(模式列表)
                匹配给定模式之一

     

!(模式列表)
                匹配除了给定模式之外的任何内容