J'ai un gros fichier bibtex avec de nombreuses entrées où chaque entrée a la structure générale
@ARTICLE{AuthorYear,
item = {...},
item = {...},
item = {...},
etc
}
(dans certains cas, ARTICLE
peut être un mot différent, par exemple BOOK
)
Ce que je voudrais faire, c'est écrire un script simple (de préférence juste un script shell) pour extraire les entrées avec AuthorYear donné et les mettre dans un nouveau fichier .bib.
Je peux imaginer que je peux reconnaître la première phrase d'une entrée par AuthorYear et la dernière par la fermeture unique }
et peut-être utiliser sed
pour extraire l'entrée, mais je ne sais pas vraiment comment faire exactement. Quelqu'un peut-il me dire comment j'y arriverais?
Cela devrait probablement être quelque chose comme
sed -n "/AuthorYear/,/\}/p" file.bib
Mais cela s'arrête en raison de la fermeture }
du premier élément de l'entrée, donnant ainsi cette sortie:
@ARTICLE{AuthorYear,
item = {...},
J'ai donc besoin de reconnaître si le }
est le seul caractère sur une ligne et de ne lire «sed» que lorsque c'est le cas.
la source
sed -n "/AuthorYear/,/\}$/p"
. Notez le$
symbole. Cela fonctionne très bien, sauf qu'il n'imprime pas la fermeture}
d'un bibitem. Btw, est-ce que l'utilisation desed
nécessaire?sed
n'est pas du tout nécessaire, je pensais que ce serait l'option la plus simple. J'ai trouvé un code légèrement différent:sed -n "/AuthorYear/, /^ *\}/p"
qui semble faire exactement ce que je veux, y compris la fermeture}
et la correction des espaces s'il y en aRéponses:
Le script Python suivant effectue le filtrage souhaité.
Personnellement, je préfère passer à un langage de script lorsque la logique de filtrage devient complexe. Cela a peut-être un avantage sur le facteur de lisibilité au moins.
la source
{}
s imbriqués . Si vous pouvez vous assurer que l'entrée se termine avec\n}
, vous pouvez vous arrêter avec^}
Je recommanderais d'utiliser un langage avec une bibliothèque BibTeX testée au combat au lieu de réinventer cette roue. Par exemple
Vous devrez probablement installer le module:
cpan install BibTeX::Parser
la source
Maintenant, nous avons également le module de bibparsing Python, qui permet d'analyser les bases de données BibTeX avec Python. Par exemple, j'utilise le script suivant pour calculer le nombre d'auteurs dans des articles collaboratifs:
la source
Une autre option serait d'utiliser bibtool.
Exemple:
Consultez le manuel pour les cas spécifiques.
la source
Il s'agit d'un script Bash qui lit chaque ligne et utilise la correspondance regex pour extraire chaque entrée qui a le modèle requis dans sa tête. Vous pouvez l'appeler
getbibs
ou quelque chose:Pour extraire toutes les entrées avec un auteur de 1989, vous pouvez faire:
Il peut y avoir des problèmes que je n'ai pas encore testés, mais cela semble fonctionner correctement pour la tâche.
la source
Juste pour être complet, la façon dont je me suis compris, pas aussi sympa que certains des autres, mais ça marche:
Il peut être exécuté à partir de la ligne de commande ou placé dans un script bash.
la source