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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 3
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Thomas vO
Le #115218
bonjour,

À (at) Mon, 05 Nov 2007 08:40:25 -0800,
Gamotte
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 ?


moi, je ferai :

sed s/number/volume/g fichieravant > fichierapres

hope that'll help,

--
Thomas vO -
Gamotte
Le #115217
On 5 nov, 17:58, Thomas vO
bonjour,

À (at) Mon, 05 Nov 2007 08:40:25 -0800,
Gamotte
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 ?


moi, je ferai :

sed s/number/volume/g fichieravant > fichierapres

hope that'll help,



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.


Stephane Chazelas
Le #115216
2007-11-05, 09:08(-08), Gamotte:
On 5 nov, 17:58, Thomas vO
bonjour,

À (at) Mon, 05 Nov 2007 08:40:25 -0800,
Gamotte
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 ?


moi, je ferai :

sed s/number/volume/g fichieravant > fichierapres

hope that'll help,



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



Gamotte
Le #115215
On 5 nov, 18:12, Stephane Chazelas
2007-11-05, 09:08(-08), Gamotte:



On 5 nov, 17:58, Thomas vO
moi, je ferai :

sed s/number/volume/g fichieravant > fichierapres

hope that'll help,


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.



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.



Stephane Chazelas
Le #115214
2007-11-05, 09:31(-08), Gamotte:
On 5 nov, 18:12, Stephane Chazelas
2007-11-05, 09:08(-08), Gamotte:



On 5 nov, 17:58, Thomas vO
moi, je ferai :

sed s/number/volume/g fichieravant > fichierapres

hope that'll help,


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.



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




Gamotte
Le #115213
On 5 nov, 18:52, Stephane Chazelas
2007-11-05, 09:31(-08), Gamotte:



On 5 nov, 18:12, Stephane Chazelas
2007-11-05, 09:08(-08), Gamotte:

On 5 nov, 17:58, Thomas vO
moi, je ferai :

sed s/number/volume/g fichieravant > fichierapres

hope that'll help,


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.


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





Gamotte
Le #115088
On 5 nov, 18:52, Stephane Chazelas

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



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.

Stephane Chazelas
Le #115087
2007-11-06, 02:39(-08), Gamotte:
[...]
*) 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érencer
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

Gamotte
Le #115086
On 6 nov, 12:14, Stephane Chazelas
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


Olivier Miakinen
Le #115085
Tout d'abord je vous remercie tous les deux. N'ayant jamais fait de Perl
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/


(?:#.*?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"
}


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... }


Publicité
Poster une réponse
Anonyme