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

3
我正在尝试循环遍历一堆文件前缀,寻找每个文件中匹配给定模式的单行。我已经提取并概括了几个示例,并在下面使用它们来说明我的问题。
我搜索了一行可能以一些空格开头,后跟数字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个回答

4

首先,确保已经设置了extglob

shopt -s extglob

现在,我们可以使用 *(...) 来匹配任意模式的零个或多个。例如,让我们创建一些文件并进行匹配:
$ touch logsheet logsheet2 logsheet23 logsheet234
$ echo logsheet*([0-9])
logsheet logsheet2 logsheet23 logsheet234

文档

根据 man bashbash 在使用 extglob 时提供以下功能:

?(模式列表)
匹配给定模式的零个或一个实例

*(模式列表)
匹配给定模式的零个或多个实例

+(模式列表)
匹配给定模式的一个或多个实例

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接