Ich habe eine große Bibtex-Datei mit vielen Einträgen, wobei jeder Eintrag die allgemeine Struktur hat
@ARTICLE{AuthorYear,
item = {...},
item = {...},
item = {...},
etc
}
(in einigen Fällen ARTICLE
könnte ein anderes Wort zB sein BOOK
)
Was ich tun möchte, ist ein einfaches Skript (vorzugsweise nur ein Shell-Skript) zu schreiben, um Einträge mit einem bestimmten AuthorYear zu extrahieren und diese in eine neue BIB-Datei einzufügen.
Ich kann mir vorstellen, dass ich den ersten Satz eines Eintrags von AuthorYear und den letzten am einzelnen Abschluss erkennen }
und möglicherweise sed
zum Extrahieren des Eintrags verwenden kann, aber ich weiß nicht genau, wie ich das genau machen soll. Kann mir jemand sagen, wie ich das erreichen würde?
Es sollte wahrscheinlich so etwas sein
sed -n "/AuthorYear/,/\}/p" file.bib
Dies hört jedoch aufgrund des Schließens }
im ersten Element des Eintrags auf, wodurch diese Ausgabe erfolgt:
@ARTICLE{AuthorYear,
item = {...},
Ich muss also erkennen, ob das }
das einzige Zeichen in einer Zeile ist, und nur dann "sed" aufhören zu lesen, wenn dies der Fall ist.
quelle
sed -n "/AuthorYear/,/\}$/p"
. Beachten Sie das$
Symbol. Es funktioniert}
einwandfrei , außer dass das Schließen eines Bibitems nicht gedruckt wird . Übrigens, ist die Verwendung vonsed
notwendig?sed
ist überhaupt nicht notwendig, ich dachte nur, das wäre die einfachste Option. Ich habe einen etwas anderen Code herausgefunden: Diesersed -n "/AuthorYear/, /^ *\}/p"
scheint genau das zu tun, was ich will, einschließlich des Schließens}
und Korrigierens von Leerzeichen, falls vorhandenAntworten:
Das folgende Python-Skript führt die gewünschte Filterung durch.
Persönlich bevorzuge ich den Wechsel zu einer Skriptsprache, wenn die Filterlogik komplex wird. Das hat vielleicht zumindest einen Vorteil für den Lesbarkeitsfaktor.
quelle
Ich würde empfehlen, eine Sprache mit einer kampferprobten BibTeX-Bibliothek zu verwenden, anstatt dieses Rad neu zu erfinden. Beispielsweise
Sie müssen wahrscheinlich das Modul installieren:
cpan install BibTeX::Parser
quelle
Dies ist ein Bash-Skript, das jede Zeile liest und Regex-Matching verwendet, um jeden Eintrag zu extrahieren, der das erforderliche Muster im Kopf hat. Sie können es
getbibs
oder so nennen:Um alle Einträge mit einem Autorenjahr von 1989 zu extrahieren, haben Sie folgende Möglichkeiten:
Möglicherweise gibt es einige Probleme, die ich noch nicht getestet habe, aber es scheint für die Aufgabe in Ordnung zu sein.
quelle
Nur um ganz zu sein, wie ich es selbst herausgefunden habe, nicht so schön wie einige der anderen, aber es funktioniert:
Es kann über die Befehlszeile ausgeführt oder in ein Bash-Skript eingefügt werden.
quelle
Jetzt haben wir auch das Python-Bibparsing-Modul, mit dem BibTeX-Datenbanken mit Python analysiert werden können. Zum Beispiel verwende ich das folgende Skript, um die Anzahl der Autoren in kollaborativen Artikeln zu berechnen:
quelle
Eine andere Möglichkeit wäre die Verwendung von bibtool.
Beispiel:
Lesen Sie das Handbuch für bestimmte Fälle.
quelle