Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

corriger un fichier bibtex

24 réponses
Avatar
Gamotte
Bonjour,

J'ai un fichier de bibliographie au format bibtex o=F9
dans beaucoup d'entr=E9es le num=E9ro de volume est
indiqu=E9 par erreur dans le champ "number".
Je voudrais donc tester pour chaque entr=E9e si
le champ volume est renseign=E9, si ce n'est pas
le cas tester le champ number et le cas =E9ch=E9ant
supprimer number et modifier volume comme il
faut.
Auriez vous des pistes pour r=E9oudre mon probl=E8me ?

Merci d'avance

10 réponses

1 2 3
Avatar
Thomas vO
bonjour,

À (at) Mon, 05 Nov 2007 08:40:25 -0800,
Gamotte nous disait (told us):
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 - <http://perso.enstimac.fr/~vanouden/>

Avatar
Gamotte
On 5 nov, 17:58, Thomas vO <vanouden+ wrote:
bonjour,

À (at) Mon, 05 Nov 2007 08:40:25 -0800,
Gamotte nous disait (told us):

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.


Avatar
Stephane Chazelas
2007-11-05, 09:08(-08), Gamotte:
On 5 nov, 17:58, Thomas vO <vanouden+ wrote:
bonjour,

À (at) Mon, 05 Nov 2007 08:40:25 -0800,
Gamotte nous disait (told us):

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



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



On 5 nov, 17:58, Thomas vO <vanouden+ wrote:
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.



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



On 5 nov, 17:58, Thomas vO <vanouden+ wrote:
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




Avatar
Gamotte
On 5 nov, 18:52, Stephane Chazelas wrote:
2007-11-05, 09:31(-08), Gamotte:



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

On 5 nov, 17:58, Thomas vO <vanouden+ wrote:
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





Avatar
Gamotte
On 5 nov, 18:52, Stephane Chazelas wrote:

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.

Avatar
Stephane Chazelas
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

Avatar
Gamotte
On 6 nov, 12:14, Stephane Chazelas wrote:

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


Avatar
Olivier Miakinen
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... }


1 2 3