我正在尝试遍历一堆文件前缀,寻找与每个文件中给定模式匹配的单行。我已经提取并概括了几个例子,并在下面使用它们来说明我的问题。
我搜索了一行可能在开头有一些空格,然后是数字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中搜索以前一个模式的零个或多个结尾的文件?我有一个工作,但我正在寻找这个问题的实际答案,这可能会节省我(希望其他人)将来的时间。
答案 0 :(得分:3)
首先,确保设置extglob
:
shopt -s extglob
现在,我们可以使用*(...)
匹配任何模式的零个或多个。例如,让我们创建一些文件并匹配它们:
$ touch logsheet logsheet2 logsheet23 logsheet234
$ echo logsheet*([0-9])
logsheet logsheet2 logsheet23 logsheet234
根据man bash
,bash
为extglob
提供了以下功能:
?(模式列表)
匹配给定模式的零次或一次*(模式列表)
匹配给定模式的零次或多次出现+(模式列表)
匹配给定模式的一次或多次出现@(模式列表)
匹配给定模式之一!(模式列表)
匹配除了给定模式之外的任何内容