命令行工具通过键提取.bib 条目?

命令行工具通过键提取.bib 条目?

我想要一个工具,当给定一个.bib文件和该文件中的一个密钥作为输入时,它会输出完整条目的纯文本版本。例如:

书目目录

@Article{tversky83,
  author =   {Amos Tversky and Daniel Kahneman},
  title =    {Extension versus intuitive reasoning: The conjunction fallacy in probability judgement},
  journal =      {Psychological Review},
  year =     1983,
  volume =   90,
  pages =    {293--315}}

命令行界面

me@computer > magictool bib.bib tversky83
> Tversky, Amos, and Daniel Kahneman. "Extensional versus intuitive reasoning: The conjunction fallacy in probability judgment." Psychological review 90 (1983): 293--315.

有这样的工具吗?如果没有,您能给我一些关于如何构建它的指点吗?大概它会涉及以与 bibtex 非常相似的方式解析 bib 文件。

答案1

免责声明:我不确定这是否是您要找的droid:)工具。我是在午餐时间编写的,因此可能存在很多错误。但我们确实喜欢有问题的软件,不是吗?:)

介绍fred1

弗雷德 1

这里的想法完全符合 Seamus 的想法:给定一个 bibfile 和一个密钥,返回所需的条目(如果有)。fred是用 Java 编写的,但在这里我创建了一个 shellscript 文件来为我调用它:

#!/bin/bash

SOURCE="${BASH_SOURCE[0]}"
while [ -h "$SOURCE" ] ; do SOURCE="$(readlink "$SOURCE")"; done
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd -P "$( dirname "$SOURCE" )" && pwd )"
java -jar "$DIR/fred.jar" $*

致谢约瑟夫·赖特感谢这个出色的脚本。

通常的调用方式fred是:

$ java -jar fred.jar <bibfile> <key>

考虑以下.bib文件:

@MISC{osi:1998,
  author = {Bruce Perens and Eric Steven Raymond},
  title = {Open Source Initiative},
  year = {1998},
  note = {Nonprofit corporation with global scope formed to educate about and
    advocate for the benefits of open source and to build bridges among
    different constituencies in the open source community.},
  url = {http://www.opensource.org/}
}

@Article{tversky83,
  author =   {Amos Tversky and Daniel Kahneman},
  title =    {Extension versus intuitive reasoning: The conjunction fallacy
             in probability judgement},
  journal =  {Psychological Review},
  year =     1983,
  volume =   90,
  pages =    {293--315}
}

现在让我们简单地fred调用我的references.bib文件:

弗雷德 2

我如何设置输出格式?fred使用当地的(非全局)以 YAML 格式编写的配置文件,它决定了输出应该是什么样子。让我们看看我的示例config.yaml文件:

types:

- type: MISC
  format: '$!{author}. $!{title}.'

- type: ARTICLE
  format: '$!{author}. "$!{title}". $!{journal} ${volume} (${year}): ${pages}.'

type与 BibTeX 条目的类型(文章、书籍、技术报告等)相关,而format保存用于打印条目的模板。模板是使用阿帕奇速度模板引擎。我可以添加一些更复杂的验证(例如,如果字段为空,则隐藏下一个标点符号),但对于一个简单的示例来说,模板会变得非常复杂。此模板的唯一“高级”部分是使用变量的“静默”回退,即变量${author}将解析为authorBibTeX 条目的字段,如果字段不存在,则保持原样。如果我使用$!{author},则不会显示空变量。

现在让我们fred再次运行:

弗雷德

重要的是要观察author字段是否按原样处理。我必须包含一个静态方法来解析每个作者并相应地显示他们的名字。我将尝试在不久的将来为此功能编写一些辅助方法,但目前,这是我可以提供的 - 毕竟,我是在午餐时间写的。:)

如果我们尝试打印一个无效的密钥:

弗雷德 4

fred有自己的GitHub 存储库, 在下面下载部分。请注意,fred至少从 1.5 版开始,需要 Java 虚拟机。还提供了 shellscript 文件,请确保在同一文件夹中包含fredfred.jar文件,并将其添加到系统路径。

希望你们喜欢这个简陋的工具。:)


  1. fred以前被称为horned owl(责备敲击)。:)给读者一个练习:找出这fred意味着什么。提示:问安德鲁·史黛西:)

答案2

这是一个 Perl 程序模板,可用于根据键提取条目的任何部分:

#! /usr/bin/env perl

use warnings;
use strict;
use feature qw(say);
use Text::BibTeX;

die "Usage $0 <bibfile> <key>\n" if @ARGV != 2;
my $fn=shift;
my $key=shift;

my $bibfile = new Text::BibTeX::File($fn);

while (my $entry = new Text::BibTeX::Entry($bibfile)) {
  if (!$entry->parse_ok) {
    warn "error in input";
    next;
  }
  my $ckey = $entry->key; 
  if (defined $ckey) {
    my $title="<no title found>";
    if ($ckey eq $key) {
      if ($entry->exists ('title')) {
        $title = $entry->get ('title');
      }
      say "$key : '$title'";
      exit;
    }
  }
}
say "Key '$key' was not found.";

我们这里以给定的键提取条目的标题为例。(注意:您必须libbtparse-dev在 Ubuntu 上安装了运行的软件包…… sudo apt-get install libbtparse-dev:)

相关内容