上下文:我正在编写一个shell脚本来帮助管理以文本文件以人类可读方式存储并使用普通文本编辑器进行编辑的简单数据库。 (每个条目是一个文本文件,其名称是一个ID号,并且所有文件都存储在一个目录中。)POSIX正则表达式:仅在逗号分隔的项目内匹配
我目前的问题是搜索。有一些头文件,它们基本上是文件顶部的数据字段。例如,我们来看一下标记字段,该字段从Tags:\t
(其中\t
是一个字面制表符)开始,然后有一个逗号分隔标记列表。我希望能够将用户提供的正则表达式插入到对grep
的更大调用中,并且只有在每个逗号分隔项内,用户的正则表达式匹配。
下面是从我的文档有点描述,我想发生什么:
hregexes是仅在逗号分隔的项目匹配ERES。例如,对于首标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。
我确实试图想出一个模式,但是我用regexps来做一些复杂的事情还不够好。在以下尝试中,$2
是我们正在查找的标题,并且$3
是在该标题中匹配的模式。
grep -El "$2: (|.*,|.*,)[^,]*$3[^,]*(,|\b)" *.dre
这不会错过它应该抓住任何结果,但它的问题在于o, ba
和foo.*baz
都匹配时,他们不应该;在这一点上,我不妨只搜索$2: .*$3
。
如果这对于单个ERE来说是不可能的,那么在Bash中是否有另一种好方法呢?我的数据库已经有超过一千个文件,并且可以轻松增长到很多次,所以我不希望循环遍历每个文件,然后遍历逗号分隔列表中的每个项目,并且每次都会产生shell开销。
我没有尝试,但它看起来像你在正确的轨道上。你也碰到了在纯shell中能够实现的限制,所以请记住,来自用户的下一个功能请求可能会促使你用更低级的语言编写一些帮助程序:) – Perry