Re: [ssfr] sed : remplacer guillemets anglais par guillements français

[ Thread Index | Date Index | More debianworld.org/shellscript-fr Archives ]


Bonjour,

Le 02-11-2008, à 10:19:39 +0100, Jacques L'helgoualc'h (jacques.lhh+SSFR@xxxxxxxxx) a écrit :

> dlist@xxxxxxxxxx a écrit, samedi 1 novembre 2008, à 14:36 :
> bonjour.
> 
> > J'ai plusieurs fichiers tex où il faudrait remplacer les " par des «»,
> > je me dis que c'est pour sed ça.
> 
> Oui et non,
> 
>  - une paire de guillemets peut s'étaler sur plusieurs lignes ;

C'est le cas,

>  - elles peuvent être éventuellement emboîtées ;

également ..

>  - en (La)TeX, il vaut mieux utiliser les commandes \og et \fg (quitte à
>    les redéfinir) ;

Merci je les avais complètement oublié.

>  - suivant  la nature du texte,  certains « " » peuvent ne  pas être des
>    guillemets --- même la parité ne permet pas de déterminer si ça ouvre
>    ou ça ferme  : dans un polycopié sur le « shell »,  tu peux donner un
>    exemple de chaîne contenant une « double-quote », comme "\""...

Effectivement, cette histoire de parité est très embêtante. En faisant
un 

grep \" fichier.tex | wc -l

je m'aperçois que le résultat n'est pas un nombre pair.

>    Tu peux aussi vouloir essayer sur ce texte-ci :)

J'ai déjà assez à faire avec mon document tex :-), enfin ce n'est pas le
mien mais celui de ma femme, son travail de master. Je lui avais dit au
début d'écrire correctement le texte mais mon conseil a dû se perdre je
ne sais où ..

> > le motif est 
> > "puis 0,1 ou plus espaces puis un mot puis 0,1 ou plus espaces et enfin"
> 
> Ben non, tu  peux avoir plusieurs mots, éventuellement  composés, et des
> \commandes comme "\TeX".

Oui en fait j'avais noté ce motif tout au début de ma réflexion (pardon
Edi).

> > Ce motif doit être remplacé par
> > 
> > «un_espace_insécable puis le mot puis un_espace_insécable puis »
> > 
> > Faut traduire ça en sed maintenant, et c'est là que ça se complique
> > (pour moi).
> 
> Tu peux essayer (GNU Sed --- sans garantie)
> 
>  sed -i.old -re 's/"[[:space:]]*([^"]*)[[:space:]]*"/\\og \1 \\fg /g

Pour les archives, la commande complète est :

sed -i.old -re 's/"[[:space:]]*([^"]*)[[:space:]]*"/\\og \1 \\fg /g'
fichier_in.tex

Alors ça semble marcher sur les occurences d'une même ligne mais pas sur
plusieurs (ce qui était attendu mesemble-t-il).


> (les commandes \og et \fg pourront gérer l'insécabilité des espaces).

Nikel ! Merci

> Pour les multilignes, quelque chose comme
> 
>  sed -i.old -nre '
> H
> ${
> 	g
> 	s/"[[:space:]]*([^"]*)[[:space:]]*"/\\og \1 \\fg /g
> 	p
> }'


J'ai essayé cette expression en la mettant sur une ligne, mais il y a
une erreur :

sed -i.old -nre 'H ${g s/"[[:space:]]*([^"]*)[[:space:]]*"/\\og \1 \\fg
/g p}' partie3b.tex

sed: -e expression n°1, caractère 3: caractères inutiles après la
commande


Faut que je m'y penche dessus.

> > Merci pour vos suggestions.
> 
> Sur un  texte purement  littéraire, ça pourrait  passer, mais en  cas de
> doute j'essaierai plutôt avec le C-M-% interactif d'Emacs.

Connais pas.

> Cherche aussi dans les archives de fctt (news:fr.comp.text.tex)...

Merci pour toutes ces suggestions et conseils, ils m'ont vraiment bien
aidé et fait gagné du temps.

Steve

---


Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/