自动从 .bib 文件中删除包含 biblatex 条目(例如 @Thesis)的字段

自动从 .bib 文件中删除包含 biblatex 条目(例如 @Thesis)的字段

我需要自动从 .bib 文件中删除某些字段(例如abstractreviewgroupfile- 这些字段不仅包含 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 = {和之间的所有内容},

您可以将其应用到其他领域。

相关内容