我希望能够使用类似这样的工具来grep
提取整个 bibtex 参考文献,而不仅仅是匹配的行。例如,grep Smith mydatabase.bib
将返回包含单词 的行Smith
。我希望有一个命令行程序可以返回包含单词 的整个 bibtex 参考文献Smith
。
- 如何在命令行上完成此操作?
特别是,我感兴趣的是是否有办法使用sed
或awk
执行该任务?
答案1
bibtool --select {"Smith"} <file>.aux -o <file>.bib
创建一个仅包含 Smith 条目的新书目数据文件。
bibtool
应该是你的 TeX 发行版的一部分。
答案2
命令行工具bib2bib
提供了非常灵活和可靠的方法来根据某些标准过滤/提取 bibtex 条目。这个(鲜为人知的)实用程序是bibtex2html工具套件。(注意:您必须寻找PDF文档,HTML 文档不讨论bib2bib
!)
例如,要提取所有Smith
作者为的条目,只需写道:
bib2bib -oc smith-citations -ob smith.bib -c 'author : "Smith"' mydatabase.bib
多个条件可以分组并用 and/or/not 组合,因此您可以扩展上述查询以包含Smith
标题、摘要或其他内容中提到的参考文献。
bib2bib
与“手工制作”的解决方案相比,它的一大优点awk/sed/grep
是它可以很好地处理字符串常量、交叉引用等(您可以在输出文件中包含所有依赖项,也可以bib2bib
扩展它们,以便条目是自包含的)。
答案3
使用标准 textutils 来正确处理这种事情会非常麻烦,因为 Bibtex 没有正确指定,并且如果文件不是按行构造的,这些工具就不擅长处理文件。
你可以得到接近你想要的东西,通过tr
将 bib 项目转换为行并再次转换回来。例如:
<input.bib tr "@\n" "\n\0"|grep -a article|(tr "\n\0" "@\n")
将选择所有包含单词 article 的 bib 项目。
两个问题:
- 处理方式
@
很棘手:条目内的出现会导致它们被分成两行,第一行将@
被删除。这可以修复,但它会使脚本更加复杂。 - tr 转换之间的行包含许多 \0 字符,这意味着许多 textutils 要么不会处理它们,要么需要将开关传递给它们:这里
grep
需要-a
开关。
后记
以下函数定义执行稍微复杂一些的转换,可以处理得@
更好(并使用sed
):
bib2unix () { if test "$# > 0"; then cat "$@"; else cat; fi | tr "@\n" "\n\0" | sed "2,\$s/^/@/"; }
unix2bib () { tr -d "\n" | tr "\0" "\n"; }
可以这样使用:
bib2unix input.bib |grep -a @article| unix2bib
选择所有文章并将它们发送到 STDOUT。
答案4
bibtool
虽然我更喜欢和之类的专用工具bib2bib
,但这里是使用 awk 完成任务的一种方法。
awk 'BEGIN {RS="\n@"} /Smith/{print "@" $0}' mydatabase.bib
\n@
如果 bibtex 数据库格式整齐并且@
始终出现在第一列,则记录分隔符会起作用。{print "@' $0}
是可选的。它@
通过成为@
记录分隔符的一部分来替换删除的。如果 bibtex 记录正在通过管道传输到另一个位置,这将很重要。
awk -v RS='\n@' '/Smith/' mydatabase.bib
- 这是与上述类似的缩写版本
-v RS='\n@'
在命令行上设置记录分隔符变量。