【发布时间】:2016-04-27 20:41:30
【问题描述】:
上下文:我正在编写一个 shell 脚本来帮助管理一个简单的数据库,该数据库以人类可读的方式存储在文本文件中,并使用普通文本编辑器进行编辑。 (每个条目都是一个文本文件,其名称是一个 ID 号,所有文件都存储在一个目录中。)
我目前的问题是搜索。有一些 headers 基本上是文件顶部的数据字段。例如,让我们以标签字段为例,它以 Tags:\t (其中\t 是文字制表符)开始新行,然后有一个逗号分隔的标签列表。我希望能够将用户提供的正则表达式插入到对grep 的更大调用中,并使用户的正则表达式匹配仅在每个逗号分隔的项目中。
以下是我的文档中的一些描述我希望发生的事情:
hregexes 是仅在逗号分隔的项目中匹配的 ERE。例如,带有标题Tags: foo, bar baz:
REGEX :: MATCHES?
foo :: yes
bar :: yes
baz :: yes
az :: yes
.*baz :: yes
ba.*az :: yes
o, ba :: no
foo.*baz :: no
理想情况下,这将完全与 POSIX 扩展正则表达式一起工作,以与系统的其余部分保持一致;我有一个在 Python 中工作的简化版搜索,但我决定重写该部分,这样系统就不会有一些搜索采用 POSIX 正则表达式和一些 Python 正则表达式。
我确实尝试过想出一个模式,但我对正则表达式还不够好,无法完成如此复杂的事情。在接下来的尝试中,$2 是我们要查找的标头,$3 是要在该标头中匹配的模式。
grep -El "$2: (|.*,|.*, )[^,]*$3[^,]*(,|\b)" *.dre
这不会错过它应该捕获的任何结果,但它存在o, ba 和foo.*baz 在不应该匹配时都匹配的问题;在这一点上我还不如搜索$2: .*$3。
如果单个 ERE 无法做到这一点,那么在 Bash 中是否有另一种好方法可以做到这一点?我的数据库已经有超过一千个文件,并且很容易增长到很多倍,所以我不希望循环遍历每个文件,然后遍历逗号分隔列表中的每个项目,并且每次都会产生 shell 开销。
【问题讨论】: