我需要自动从 .bib 文件中删除某些字段(例如abstract
、review
、group
和file
- 这些字段不仅包含 bibtex 条目,还包含(较新的)biblatex 条目,例如@Thesis
。这与提问和回答相同在这个问题中,但适用于包括 biblatex 条目的文件。
@Thesis
.bib 文件中的示例条目可能如下所示:
@Thesis{Author_18_TheThesis,
author = {Mr Author},
title = {The Thesis},
type = {Doctoral Dissertation},
institution = {Department of Documents, University of Stackexchange},
year = {2018},
abstract = {This is the abstract.},
file = {:author/Author_18_TheThesis.pdf:PDF},
review = {This is the review.},
groups = {publications},
}
比布工具,这是所接受的答案是提到的问题,似乎尚不支持此类条目,并会跳过它们并发出警告:
@Thesis{Author_18_TheThesis,
_^
*** BibTool ERROR: (line 123 in ./yourbibliography.bib): Unknown entry type
*** BibTool WARNING: Skipping to next '@'
如何从包含 biblatex 条目的 .bib 文件自动删除这些字段?(我更喜欢在 Linux 机器上运行的解决方案)。
答案1
Andrew Swann 的回答使用 OP 中最初链接的 bibtool 确实有效,只要biblatex
提供资源(ht to moewe)。
因此,对于一个文件remove-fields.rsc
:
preserve.keys = On
preserve.key.case = On
resource{biblatex}
delete.field = { abstract }
delete.field = { review }
delete.field = { groups }
delete.field = { file }
命令:
bibtool -r remove-fields ./references.bib -o new.bib
将导致:
@Thesis{ Author_18_TheThesis,
Author = {Mr Author},
Title = {The Thesis},
Type = {Doctoral Dissertation},
Institution = {Department of Documents, University of Stackexchange},
Year = {2018},
ispreprintpublic={test}
}
答案2
注意:默认情况下,
biber
会默默删除数据模型未知的字段。因此,如果您碰巧使用非标准字段,请参阅下面的更新。
您可以biber
将 的工具模式与适当的源图一起使用。
在 biber 的工具模式下,它对您的数据源进行操作,因此您应该在命令行上运行 if,例如:
biber --tool --configfile=biber-tool.conf <mybibfile>.bib
(当然,<>
只需用合适的文件名替换即可)。
biber-tool.conf
指定您希望 biber 对您的文件执行的操作。就您而言,您希望从条目中删除某些字段,因此 sourcemap 是完成此操作的合适工具。 的内容biber-tool.conf
将是(以及一些与控制输出外观相关的其他选项):
<?xml version="1.0" encoding="UTF-8"?>
<config>
<output_fieldcase>lower</output_fieldcase>
<output_indent>2</output_indent>
<output_align>true</output_align>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map map_overwrite="1">
<map_step map_field_set="abstract" map_null="1"/>
<map_step map_field_set="review" map_null="1"/>
<map_step map_field_set="groups" map_null="1"/>
<map_step map_field_set="file" map_null="1"/>
</map>
</maps>
</sourcemap>
</config>
通过此设置,biber 上面的命令将输出一个<mybibfile>_bibertool.bib
已删除指定字段的新文件。
您输入的结果将是:
@thesis{Author_18_TheThesis,
author = {Author, Mr},
institution = {Department of Documents, University of Stackexchange},
date = {2018},
title = {The Thesis},
type = {Doctoral Dissertation},
}
更新:默认情况下,biber
会默默删除数据模型未知的字段。因此,如果您的数据源中有任何此类字段,或者您不确定并希望收到有关任何被忽略字段的警告,请使用以下选项--validate-datamodel
:
biber --tool --validate-datamodel <mybibfile>.bib
对于您的输入,将会给出以下警告:
WARN - Datamodel: Entry 'Author_18_TheThesis' (references.bib): Field 'groups' invalid in data model - ignoring
WARN - Datamodel: Entry 'Author_18_TheThesis' (references.bib): Field 'ispreprintpublic' invalid in data model - ignoring
现在,如果不想删除这些字段而必须保留它们,则必须扩展 的biber
数据模型以包含它们,这可以在您的自定义 中完成biber-tool.conf
,方法是在组中添加非标准字段<fields>...</fields>
。 在您的例子中(假设这些是“文字”类型字段):
<field fieldtype="field" datatype="literal">ispreprintpublic</field>
<field fieldtype="field" datatype="literal">groups</field>
并在组内<entryfields><entrytype>thesis</entrytype>...<\entryfields>
添加:
<field>ispreprintpublic</field>
<field>groups</field>
由此产生的习惯biber-tool.conf
是:
<?xml version="1.0" encoding="UTF-8"?>
<config>
<output_fieldcase>lower</output_fieldcase>
<output_indent>2</output_indent>
<output_align>true</output_align>
<sourcemap>
<maps datatype="bibtex" map_overwrite="1">
<map map_overwrite="1">
<map_step map_field_set="abstract" map_null="1"/>
<map_step map_field_set="review" map_null="1"/>
<map_step map_field_set="groups" map_null="1"/>
<map_step map_field_set="file" map_null="1"/>
</map>
</maps>
</sourcemap>
<datamodel>
<fields>
<field fieldtype="field" datatype="literal">ispreprintpublic</field>
<field fieldtype="field" datatype="literal">groups</field>
</fields>
<entryfields>
<entrytype>thesis</entrytype>
<field>ispreprintpublic</field>
<field>groups</field>
</entryfields>
</datamodel>
</config>
有了它,对于这个输入:
@Thesis{Author_18_TheThesis,
author = {Mr Author},
title = {The Thesis},
type = {Doctoral Dissertation},
institution = {Department of Documents, University of Stackexchange},
year = {2018},
abstract = {This is the abstract.},
file = {:author/Author_18_TheThesis.pdf:PDF},
review = {This is the review.},
groups = {publications},
ispreprintpublic = {test},
}
输出为:
@thesis{Author_18_TheThesis,
author = {Author, Mr},
institution = {Department of Documents, University of Stackexchange},
date = {2018},
ispreprintpublic = {test},
title = {The Thesis},
type = {Doctoral Dissertation},
}
这并不是特别简单。但是,引用评论PLK 对此事的评论:“在工具模式下拥有数据模型的好处大于这类问题。”
答案3
另一个选项是该bib2bib
工具,它提供了非常灵活和可靠的方法来过滤/提取/扩展 bibtex 条目。这个(鲜为人知的)实用程序是bibtex2html工具套件。(注意:您必须寻找PDF文档,HTML 文档没有讨论bib2bib
。)
例如,从biblatex.bib
文件中删除某些字段并将输出保存到bibtex.bib
:
bib2bib --remove abstract --remove file --remove review -ob bibtex.bib biblatex.bib
还可以指定过滤和排序选项、重命名字段(--rename <old> <new>
)等等。
答案4
您可以使用文本编辑器(如 Sublime)手动执行此操作。激活 Regex 函数(Mac 上为 option+command+R)并查找:
abstract = {.*},
并且用无替代的方式。
这将删除abstract = {
和之间的所有内容},
您可以将其应用到其他领域。