#1 Le 16/08/2016, à 13:13
- Sub0
Ajout interactif d’entrées dans les fichiers biblatex
Boujour,
voilà un script que j’utilise depuis plusieurs mois, ayant énormément d’articles scientifiques à entrer dans des fichiers .bib.
Ça peut peut-être intéresser des étudiants en cours de rédaction de mémoire, thésards, curieux, etc.
C’est le genre de truc qui serait probablement plus efficace en perl ou autre, mais j’aime le pur bash pour le moment.
Infos :
- J’utilise plusieurs fichiers .bib thématiques, tous dans un même répertoire.
- Le script propose de choisir parmi les fichiers.bib présent dans le répertoire renseigné. Il est possible de renseigner directement un fichier ou l’entrée sera ajoutée en paramètre (doit être un .bib).
- Il n’est pas possible de ne pas ajouter d’étiquette à une entrée (logique).
- Le script permet d’ajouter plusieurs entrées, et de corriger une entrée saisie avant de la copier dans le fichier, après avoir donné un récapitulatif.
- Il est également possible d’ajouter une entrée. Dans ce cas, elle sera à la fin du bloc.
- Quand un champ n’est pas renseigné, il n’apparait pas dans la sortie finale.
#!/bin/bash
#Ici, le chemin du répertoire qui contient les fichiers .bib (remplacer utilisateur par votre $USER
dir="/home/utilisateur/Articles/Bibliographie/"
# Un tableau contenant les fichiers .bib
files=(/home/utilisateur/Articles/Bibliographie/*.bib)
# Les classes possibles -- Adaptez selon vos besoins
types=(article book inbook proceedings inproceeding collection periodical thesis report unpublished)
usage () {
printf "Erreur -- Classes :\n"
for i in "${types[@]}" ; do printf "%s " "$i" ; done
printf "\n"
exit
}
imprime () {
for i in "${!champs[@]}" ; do
printf "\t%s\n" "${champs[$i]}={${entries[${champs[$i]}]}},"
done
}
change () {
until [[ $continue = N ]] ; do
read -e -p "Lequel ? : " choice
read -e -p "Entrée ? : " new
if [[ ${entries[$choice]+_} ]] ; then
entries[$choice]="$new"
else
champs+=("$choice")
entries+=([$choice]="$new")
fi
read -e -p "Faut-il ajouter un champ ? (o/N) : " continue
done
}
while [[ $ajouter != N ]] ; do
[[ $# = 0 ]] && select i in "${files[@]#$dir}" ; do bibfile="$dir$i" && break ; done
[[ $# = 1 ]] && if [[ $1 =~ .*\.bib ]] ; then bibfile=$1 ; else printf "Erreur : j'attends un fichier .bib\n" && exit ; fi
printf "bibfile is $bibfile ($REPLY)\n"
read -e -p "Classe ? : " -i "article" classe
declare -a champs
case $classe in
# Les champs proposés pour chaque type d’article. Ajustez en fonction de votre utilisation.
article)
champs=(author title subtitle journaltitle journalsubtitle issue issuetitle publisher volume number series year month issn doi url urldate pages keywords)
;;
book)
champs=(author title subtitle year origdate publisher edition series isbn location keywords)
;;
inbook)
champs=(author title subtitle bookauthor booktitle booksubtitle year location isbn pages publisher)
;;
proceedings)
champs=(author title organization date year location url urldate keywords)
;;
inproceedings)
champs=(author title booktitle organization date year location url urldate keywords)
;;
collection)
champs=(title editor year date publisher doi url urldate)
;;
periodical)
champs=(title subtitle editor pubstate volume number series issue issuetitle issuesubtitle url urldate)
;;
thesis)
champs=(author title subtitle doi type institution year url urldate keywords)
;;
report)
champs=(author title subtitle type number version institution year note url urldate pubstate keywords)
;;
unpublished)
champs=(author title subtitle howpublished note location date month year pubstate url urldate keywords)
;;
*)
usage
;;
esac
until [[ -n $label ]] ; do
read -p "Étiquette ? : " label
done
declare -A entries
index=0
for i in "${champs[@]}" ; do
read -p "$i : " answer
if [[ -n $answer ]] ; then
entries[$i]="$answer"
else
unset -v 'champs[$index]'
fi
index=$(( index + 1 ))
done
printf "\n%s\n%s\n%s\n" \
"----------------------------------" \
"Récapitulatif : " \
"@$classe{$label,"
imprime
printf "%s\n%s\n" \
"}" \
"----------------------------------"
read -e -p "Faut-il ajouter un champ ? (o/N) : " rep
[[ $rep = o ]] && change
{
printf "%s\n" "@$classe{$label,"
imprime
printf "}\n"
} >> "$bibfile"
label=""
read -e -p "Faut-il ajouter une entrée ? (o/N) : " ajouter
done
Exemple de sortie :
@article{PaloqueTurquier1,
author={Camille {Paloque-Berges} and Barbara Turquier},
title={Pour une archéologie des virus. Entretien avec Jussi Parikka},
journaltitle={Tracés},
journalsubtitle={Revue des sciences humaines},
issue={21},
issuetitle={Contagions},
number={21},
year={2011},
doi={10.4000/traces.5230},
url={http://traces.revues.org/5230},
urldate={13-12-01},
pages={235--247},
}
J’essaie de faire du « pure » bash et d’être propre.
Ce script a été l’occasion d’apprendre à manier des tableaux et à renforcer mon bash. Quelque peu « expérimental » pour moi donc. Mais il n’a jamais faillit après des centaines d’utilisations.
Toute critique visant à l’améliorer bienvenue !
Dernière modification par Sub0 (Le 16/08/2016, à 13:25)
Seule alternative au bépo acceptée = stylo/papier.
Hors ligne