我的 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文件的一个很好的解决方案。