自動從 .bib 檔案中刪除包含 biblatex 條目(例如@Thesis)的字段

自動從 .bib 檔案中刪除包含 biblatex 條目(例如@Thesis)的字段

我需要自動從 .bib 檔案中刪除某些欄位 - 例如abstractreviewgroupfile- ,這些欄位不僅包含 bibtex 條目,還包含(較新的)biblatex 條目,例如 .bibtex 條目@Thesis。這與詢問和回答相同在這個問題中,但對於包含 biblatex 條目的檔案。

@Thesis.bib 檔案中a 的範例條目可能如下所示:

 @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

安德魯·斯旺的回答使用最初連結在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 的工具模式下,它在您的資料來源上運行,因此您應該在命令列上運行,例如:

biber --tool --configfile=biber-tool.conf <mybibfile>.bib

(當然,<>只是供您替換為適當的文件名)。

biber-tool.conf指定您希望 biber 對您的檔案執行的操作。就您而言,您希望從條目中刪除某些字段,因此來源對應是足夠的工具。的內容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 上為選項+指令+R)並尋找:

abstract = {.*},

並用任何東西代替它。

這會刪除abstract = {和之間的任何內容},

您可以將其應用到其他領域。

相關內容