如何使用命令行工具提取包含搜索词的 bibtex 参考?

如何使用命令行工具提取包含搜索词的 bibtex 参考?

我希望能够使用类似这样的工具来grep提取整个 bibtex 参考文献,而不仅仅是匹配的行。例如,grep Smith mydatabase.bib将返回包含单词 的行Smith。我希望有一个命令行程序可以返回包含单词 的整个 bibtex 参考文献Smith

  • 如何在命令行上完成此操作?

特别是,我感兴趣的是是否有办法使用sedawk执行该任务?

答案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 项目。

两个问题:

  1. 处理方式@很棘手:条目内的出现会导致它们被分成两行,第一行将@被删除。这可以修复,但它会使脚本更加复杂。
  2. 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@'在命令行上设置记录分隔符变量。

相关内容