我很好奇,有多少书目词典我在过去几十年里收集的条目。所以我对自己说:“让我们为此编写一个快速脚本吧!”
对于那些不熟悉 BibTeX 的人:每个条目都以类型标识符开头,例如@book
、等。实际上,定义了 50 多个不同的 tpye 标识符,但是将来可能会扩展吗?通常(但不一定)该标识符放置在行的开头。所以我的 1 号正则表达式应该包含匹配条目的起始行。@article
@incollection
[[:space:]]*@\w+
不幸的是,有三个标识符,它们不是开始参考书目来源:@comment
、@string
和@preamble
。我偶尔会在我的文件中使用其中一些。为了匹配这些,我应该编写 regexp No. 2 like @((comment)|(string)|(preamble))
,它工作得很好并且匹配得很好。
但最后三个表达式不应算作参考书目项目,因此我的最终正则表达式应为“查找第 1 号但不是第 2 号的所有正则表达式”
这是我未能组合这两个正则表达式组的地方。我通过管道两个正则表达式解决了这个问题,第二个使用开关-v
来反转结果,但我确信,有一种方法可以将其写在一个正则表达式中。
答案1
您可以使用消极前瞻不匹配@
时comment
,string
或preamble
(或以这些字符串开头的任何内容)如下:
grep -P '^[[:space:]]*@(?!comment|string|preamble)\w' file