我需要自動從 .bib 檔案中刪除某些欄位 - 例如abstract
、review
、group
和file
- ,這些欄位不僅包含 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 = {
和之間的任何內容},
您可以將其應用到其他領域。