corriger un fichier bibtex
Le
Gamotte

Bonjour,
J'ai un fichier de bibliographie au format bibtex où
dans beaucoup d'entrées le numéro de volume est
indiqué par erreur dans le champ "number".
Je voudrais donc tester pour chaque entrée si
le champ volume est renseigné, si ce n'est pas
le cas tester le champ number et le cas échéant
supprimer number et modifier volume comme il
faut.
Auriez vous des pistes pour réoudre mon problème ?
Merci d'avance
J'ai un fichier de bibliographie au format bibtex où
dans beaucoup d'entrées le numéro de volume est
indiqué par erreur dans le champ "number".
Je voudrais donc tester pour chaque entrée si
le champ volume est renseigné, si ce n'est pas
le cas tester le champ number et le cas échéant
supprimer number et modifier volume comme il
faut.
Auriez vous des pistes pour réoudre mon problème ?
Merci d'avance
À (at) Mon, 05 Nov 2007 08:40:25 -0800,
Gamotte
moi, je ferai :
sed s/number/volume/g fichieravant > fichierapres
hope that'll help,
--
Thomas vO -
Merci, mais pas vraiment puisque les entrées qui ont à la fois
un number et un volume vont se retrouver avec deux champs
contradictoires. Il faut vraiment procéder au cas par cas, mais je
ne vois pas comment faire.
Peut-etre quelquechose comme:
perl -l -0777 -pe '
s{@w+s*{(?:#.*?n|"(?:\"|.)*?"|.)*?}}{
$r = $&;
$r =~ s/(s)number(s*=)/${1}volume${2}/
if ($& =~ /snumbers*=/ && $& !~ /svolumes*=/);
$r
}gse' file.mib
C'est pas fool-proof, mais ca suffit peut-etre.
--
Stéphane
Je suis vraiment reconnaissant pour l'effort fourni, mais
ca ne fonctionne malheureusement pas. Il ne reste qu'un seul
number à la sortie alors que beaucoup d'entrées ont à la fois
un number et un volume.
Sorry, petite erreure:
perl -0777 -pe '
s{@w+s*{(?:#.*?n|"(?:\"|.)*?"|.)*?}}{
$r = $&;
$r =~ s/(s)number(s*=)/${1}volume${2}/
if ($r =~ /snumbers*=/ && $r !~ /svolumes*=/);
$r
}gse' file.mib
--
Stéphane
Magique!
Mille mercis
Bon, alors j'ai essayé de décortiquer cette commande. Voila ce que ca
donne.
Merci pour tout complément ou correction.
*) perl -0777 -pe '
-0777 : traite le fichier entier comme une seule ligne
-pe : exécute le script donné en argument pour chaque ligne entrée
*) s{regexp}{expression}gse :
substitution de toutes les sous-chaîne "matchant" regexp par le
résultat de
l'expression. Le s de /gse implique que . remplace n'importe quel
caractère
y compris n.
*) $r = $&;
$r contient la chaîne reconnue, ici une entrée bibtex du @ initial
jusqu'à l'accolade fermante finale.
*) $r =~ s/(s)number(s*=)/${1}volume${2}/
if ($r =~ /snumbers*=/ && $r !~ /svolumes*=/);
Dans l'entrée bibtex courante, remplacer "number =" par "volume
=" (en conservant
le mêmes caractères blancs) uniquement si l'entrée en question
contient un number
mais pas de volume.
*) $r : afficher l'entrée traitée.
*) Reste l'expression régulière elle-même
@w+s*{(?:#.*?n|"(?:\"|.)*?"|.)*?}
@w+s* : un @ suivi d'une ou plusieurs (intérêt du + ?) chaîne
alphanumérique (avec
ou sans _), éventuellement de blancs puis de (?:#.*?n|"(?:
"|.)*?"|.)*? entre
accolades.
?: : les parenthèses ne servent qu'à grouper mais pas à référ encer
les éléments entourés
#.*?n : je ne vois pas le sens du #. Littéral ou notation de
Perl ?
"(?:\"|.)*?" : une chaîne entre guillemets pouvant contenir "
. : n'importe quel caractère
A vrai dire, je ne comprends pas bien (?:#.*?n|"(?:
"|.)*?"|.)*? dans son ensemble.
[...]
L'idee est de matcher les trucs qui peuvent legalement contenir
un "}" sans que celui-ci ne soit pas le } fermant de @TRUC{,
comme dans:
@TRUC {
# comment with }
blah = "asd}"
blih = "asd"asd"
}
--
Stéphane
OK, c'est clair. Merci
de ma vie, l'explication de texte de Gamotte faite sur le programme de
Stéphane m'a donné envie de m'y mettre vraiment. Il me reste encore une
question pour Stéphane à propos de l'expression régulière/
Je comprendrais bien si le dernier « . » de l'expression était remplacé
par « [^#"] ». Mais là, vu que toutes les répétitions sont rendues « non
gourmandes » (par *?), je ne vois pas ce qui assure qu'un # ne sera pas
associé au . plutôt qu'à l'expression « #.*?n ».
Par exemple dans :
@x{#}... plein plein de choses y compris quelques n... }