Автоматически удалять поля из файла .bib, содержащие записи biblatex, такие как @Thesis

Автоматически удалять поля из файла .bib, содержащие записи biblatex, такие как @Thesis

Мне нужно автоматически удалить определенные поля - например 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 = {и},

Вы можете применить это и к другим областям.

Связанный контент