Мне нужно автоматически удалить определенные поля - например abstract
, review
, group
, и file
- из файлов .bib, которые содержат не только записи bibtex, но и (более новые) записи biblatex, такие как @Thesis
. Это то же самое, что и спросил и ответилв этом вопросе, но для файлов, включающих записи библатекса.
Вот как @Thesis
может выглядеть пример записи для a в файле .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},
}
bibtool, который является принятым ответом на указанный вопрос, пока, похоже, не поддерживает такие записи и пропускает их с предупреждением:
@Thesis{Author_18_TheThesis,
_^
*** BibTool ERROR: (line 123 in ./yourbibliography.bib): Unknown entry type
*** BibTool WARNING: Skipping to next '@'
Как бы вы автоматически удалили такие поля из файлов .bib, содержащих записи biblatex? (Я бы предпочел решения, работающие на машине Linux).
решение1
Ответ Эндрю Суоннаиспользование bibtool, изначально связанного в OP, работает, при условии, что 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 сделал с вашим файлом. В вашем случае вы хотите удалить определенные поля из ваших записей, поэтому 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
модель данных , чтобы включить их, что можно сделать в вашем custom 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 (option+command+R на Mac) и найдите:
abstract = {.*},
и ничем его не заменить.
Это удаляет все, что находится между abstract = {
и},
Вы можете применить это и к другим областям.