BibTeX 文件:如何连接来自不同文件夹的 BibTeX 文件并保留引用文件的有效链接?

BibTeX 文件:如何连接来自不同文件夹的 BibTeX 文件并保留引用文件的有效链接?

我的 BibTeX 文件包含对文件(如 PDF 文件)的引用。我使用字段“文件”来指示引用的文件。这对于将文件与 BibTeX 条目关联非常有用。此外,还可以直接从某些软件(如 JabRef)打开文件。我想连接位于不同文件夹中的 BibTeX 文件并保留有效的相对链接。有效链接将允许从连接的 BibTeX 文件访问文件。

虚拟命令 cat 将丢失所有相关链接。

以下是我从连接中得出的一个例子。下面是位于两个不同文件夹中的两个 BibTeX 文件。字段“文件”表示引用文件的位置。在连接的结果文件中,这些“文件”字段被修改以考虑文件的位置。

Root dir
|- RootA
|  - A.bib
|- RootB
|  - B.bib

A.bib

@MISC{XY,
  title = {John Doe's Book},
  author = {John Doe},
  file = {johnDoe.pdf:johnDoe.pdf:pdf},
}

B.bib

@MISC{XX,
  title = {Jane Doe's Book},
  author = {Jane Doe},
  file = {janeDoe.pdf:janeDoe.pdf:pdf},
}

我希望这两个文件的连接看起来像这样:

@MISC{XY,
  title = {John Doe's Book},
  author = {John Doe},
  file = {johnDoe.pdf:RootA/johnDoe.pdf:pdf},
}

@MISC{XX,
  title = {Jane Doe's Book},
  author = {Jane Doe},
  file = {janeDoe.pdf:RootB/janeDoe.pdf:pdf},
}

我迄今为止使用过的工具都不会做这样的事情......

我这样做的基本想法是使用 sed 和 cut 等命令行工具的组合。但这似乎很痛苦而且不可靠。我还应该提到,应该区分绝对链接和相对链接。最后,结果文件取决于我们在哪里运行连接命令……

有谁有更好的想法,或者知道执行该操作的软件吗?

答案1

BibTool是一个强大的 BibTeX 文件操作工具。它可以做的一件事是使用正则表达式重写某个字段。

BibTool 既可以接受来自外部文件的命令,也可以直接在以 开头的命令行上接受命令--。该命令rewrite.rule={file "foo" "bar"}用 替换foo任何file条目中的每个条目bar,其中foo可以是(grep 样式)正则表达式。

显然,正则表达式取决于数据的结构,但假设每个文件看起来都像{label:filename:filetype}并且文件名中没有冒号,则可以使用以下命令RootA在每个文件前插入A.bib,并将结果打印到屏幕上。

bibtool -- 'rewrite.rule={file ":\([^/].*\):" ":RootA/\1:"}' -- 'rewrite.limit=1' A.bib 

该规则还要求文件名的第一个字符不是/,这将保留绝对路径。

答案2

正如@NathanGrigg 提到的,可以使用 bibtool 来执行此操作。如果要使用 shell 变量执行替换,则不能使用引号,并且必须转义所有特殊字符。

以下命令使用 shell 变量将目录名称添加到文件字段值中要添加的目录

dirToAdd=RootA
bibtool -- rewrite.rule={file\ \":\\\([^/].*\\\):\"\ \":${dirToAdd}/\\1:\"} -- rewrite.limit=1 A.bib

在以下 bibtex 条目上运行

@MISC{XY,
  title = {John Doe's Book},
  author = {John Doe},
  file = {johnDoe.pdf:johnDoe.pdf:pdf},
}

上一个命令将产生

@MISC{XY,
  title = {John Doe's Book},
  author = {John Doe},
  file = {johnDoe.pdf:RootA/johnDoe.pdf:pdf},
}

pybtex也是解析bibtex文件的一个很好的解决方案。

相关内容