【发布时间】:2015-02-08 21:04:33
【问题描述】:
我正在尝试遍历一堆文件前缀,以从每个文件中寻找与给定模式匹配的单行。我提取并概括了几个示例,并在下面使用它们来说明我的问题。
我搜索了一行开头可能有一些空格,然后是数字 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 中搜索以零个或多个先前模式结尾的文件?我有一个解决方法,但我正在寻找这个问题的实际答案,这可能会在未来节省我(希望其他人)的时间。
【问题讨论】: