Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/08/2016, à 12:49

Sub0

[Résolu] Script sed et nouvelle ligne

Bonjour,

question pour les sedlovers.
Je récupère régulièrement des fichiers .bib sur www.persée.fr, et je dois les retraiter pour ajouter les entrées dans mes propres fichiers.
Jusqu’alors, je le faisais avec un script en bash, qui fonctionne très bien.

Mais, l’ennui des vacances m’a poussé a approfondir sed. J’apprends donc  à jouer du x,g,G,h,t,b, etc.  Un bon loisir de vacances.

Voilà le script que j’ai pondu, qui fonctionne.


#!/usr/bin/sed -f

/^$\|Persée\|abstract\|^language/d
/ISSN/{s/ISSN/issn/}

# on place la ligne matchée dans le hold
# on modifie celle du pattern pour récupérer url=...
# on switch hold et pattern. p = ligne entière ; h = ligne url
# on la traite pour récupérer doi=...
# on ajoute le contenu de hold à pattern, on a doi=...\nurl...
/url/{
	h;
	s/.*\(doi.*\)/\1/;
	x;
	s/\(url.*\).*d.*/\l\1/;
	G;
}

# Après, on enlève enlève les espaces avant/après =
s/\ \=\ /=/g

Après quelques modifications de détails, on s’occupe de couper la ligne url en deux pour metter doi= en dessous. J’ai obtenu ce que je voulais comme expliqué en commentaire.

Voilà le fichier de départ (raccourci). Les .bib de persée ont tous le même soucis de formattage : la ligne doi = n’est pas à sa place.

Persée Citation List<comment{{NUMBER OF CITATIONS : 1}}


@article{539958,
title = {L'indicateur de bien-être économique : une application à la France},
author ={Florence {Jany-Catrice} and Stephan Kampelmann},
journal = {Revue française d'économie},
ISSN = {0769-0479},
url = {http://www.persee.fr/doc/rfeco_0769-0479_2007_num_22_1_1643},doi={10.3406/rfeco.2007.1643},
language= {fre},
publisher = {Revue Française d'Economie},
abstract = {Parmi les initiatives, multiples, qui cherchent à affiner les mesures de bien- être à partir d'une vision multicritère du bien-être économique, les travaux de Lars Osberg et d'Andrew Sharpe [...]. L'article vise à combler cette lacune empirique en proposant, à partir de bases de données originales, une estimation du bien-être économique et de son évolution sur plus de deux décennies (1980- 2003).},
keywords ={}
}

Et ce que j’obtiens à l’arrivée :

@article{539958,
title={L'indicateur de bien-être économique : une application à la France},
author ={Florence {Jany-Catrice} and Stephan Kampelmann},
journal={Revue française d'économie},
issn={0769-0479},
url={http://www.persee.fr/doc/rfeco_0769-0479_2007_num_22_1_1643},
doi={10.3406/rfeco.2007.1643},
publisher={Revue Française d'Economie},
keywords ={}
}

Ce que je n’arrive pas à faire, par contre, c’est indentér toutes les lignes, sauf la première et la dernière.

Quand j’ajoute :

/^[a-zA-Z]/{
    s/\(.*\)/\t\1/
}

j’obtiens (je coupe la sortie pour prendre moins de place)

@article{539958,
	year={2007},
	issn={0769-0479},
	url={http://www.persee.fr/doc/rfeco_0769-0479_2007_num_22_1_1643},
doi={10.3406/rfeco.2007.1643},
	publisher={Revue Française d'Economie},
} 

Pas moyen d’indenter la ligne doi.
La seule solution que j’ai trouvée, c’est de remplacer le code qui coupe la ligne par :

/url/{s/\(.*\)\(doi.*\)/\1 \
	\2/;
}

Mais j’aimerais comprende et régler le problème avec ma première instruction.
un cat fichier_de_sortie | hexdump -C montre bien qu’il y a un problème, mais je peine à interpréter.

De même, ce qui m'interroge, c'est que, sans mettre la ligne qui ajoute \t dans le script,

./persée.sed fichier.bib | sed '/^[a-zA-Z]/s{/\(.*\)\t\1/}'

fonctionne parfaitement !
Est-ce que quelqu’un peut m'éclairer ?

- Qu'est-ce qui se passe (ou ne se passe pas) ? Il manque quoi ? Un retour charriot ?
- Comment bien faire apparaitre les caractères invisibles (avec hexdump ou autre chose) ? Les \l \t \r \t, etc.

[ D'avance : awk, c’est pour plus tard. Le loisir du moment, c’est sed, merci big_smile]

Dernière modification par Sub0 (Le 16/08/2016, à 18:38)


Seule alternative au bépo acceptée = stylo/papier.

Hors ligne

#2 Le 16/08/2016, à 16:28

pingouinux

Re : [Résolu] Script sed et nouvelle ligne

Bonjour,

Sub0 #1 a écrit :

Quand j’ajoute :

/^[a-zA-Z]/{
    s/\(.*\)/\t\1/
}

Pas moyen d’indenter la ligne doi.

C'est parce qu'au moment où tu exécutes la commande ci-dessus, le pattern contient les 2 lignes url et doi, séparées par le caractère \n.
doi n'est donc pas en tête du pattern.

Hors ligne

#3 Le 16/08/2016, à 18:37

Sub0

Re : [Résolu] Script sed et nouvelle ligne

Ah mais oui, simplement ! À force de chercher, on finit par ne plus voir ce qu’on a sous les yeux !
Je vais pouvoir me débrouiller !

Merci beaucoup !

Et voilà wink :

/url/{
	h;
	s/.*\(doi.*\)/\t\1/;
	x;
	s/\(url.*\).*d.*/\l\1/;
	G;
}

Dernière modification par Sub0 (Le 16/08/2016, à 18:46)


Seule alternative au bépo acceptée = stylo/papier.

Hors ligne

#4 Le 17/08/2016, à 07:15

pingouinux

Re : [Résolu] Script sed et nouvelle ligne

Pour info, tu peux simplifier un peu.

#!/bin/sed -rf

/^($|Persée|abstract|language)/d
s/ISSN/\L&/

# on place la ligne matchée dans le hold
# on modifie celle du pattern pour récupérer url=...
# on switch hold et pattern. p = ligne entière ; h = ligne url
# on la traite pour récupérer doi=...
# on ajoute le contenu de hold à pattern, on a doi=...\nurl...
/url/{
	h;
	s/.*,(.)/\t\1/;
	x;
	s/doi.*//;
	G;
}

# Après, on enlève enlève les espaces avant/après =
s/ ?= ?/=/g
/^[a-zA-Z]/ s/^/\t/

Hors ligne