Trouver les majuscules avec sed

Résolu/Fermé
marc - 18 janv. 2012 à 17:53
 marc - 19 janv. 2012 à 16:46
Bonjour à tous,

J'ai besoin de traiter une ligne en faisant un retour à la ligne à chaque majuscule et ajouter une balise :

exemple :

Bonjour monsieur Je voudrais un croissant Merci monsieur


qui devrait donner :

Bonjour monsieur<br />
Je voudrais un croissant<br />
Merci monsieur<br />


Avec sed je n'ai pas trouvé comment rechercher les majuscules et j'ai un peu de mal avec les caractères spéciaux de la balise <br />

4 réponses

Malekal_morte- Messages postés 180304 Date d'inscription mercredi 17 mai 2006 Statut Modérateur, Contributeur sécurité Dernière intervention 15 décembre 2020 24 628
Modifié par Malekal_morte- le 18/01/2012 à 18:21
Salut,

malekalmorte@MaK-tux:/tmp$ echo "Bonjour monsieur Je voudrais un croissant Merci monsieur De rien Comment Ca? Cava"|sed -re 's/ ([A-Z])/<br\/>\n\1/g'
Bonjour monsieur<br/>
Je voudrais un croissant<br/>
Merci monsieur<br/>
De rien<br/>
Comment<br/>
Ca?<br/>
Cava


[A-Z] = toutes les majuscules (de A à Z quoi).
Y a un espace avant pour que ça prenne toutes les majuscules avec un espace avant.
Tu mets entre parenthèses pour le réafficher dans \1
Si tu as une seconde parenthèse c'est \2
3e parenthse \3 etc
et tu ajoutes <br \/> et \n pour le retour à la ligne.

Like the angel you are, you laugh creating a lightness in my chest,
Your eyes they penetrate me,
(Your answer's always 'maybe')
That's when I got up and left
1
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
18 janv. 2012 à 18:20
C'est pas tout à fait parfait mais dans l'idée :

(mando@velvet) (~) $ echo "Bonjour monsieur Je voudrais un croissant Merci monsieur" > toto 
Bonjour monsieur Je voudrais un croissant Merci monsieur

(mando@velvet) (~) $ sed -i 's%\([A-Z]\)%<br/>\n\1%g' toto

(mando@velvet) (~) $ cat toto
<br/>
Bonjour monsieur <br/>
Je voudrais un croissant <br/>
Merci monsieur


Petite explication : ici on veut faire une substitution, et pour cela il y a deux syntaxes :
- 's/motif/remplacement/options'
- 's%motif%remplacement%options'

Ici, on va utiliser la seconde syntaxe qui est plus pratique dès qu'on doit faire intervenir le caractère /, comme c'est le cas dans <br/>. En effet, si on utilise la première syntaxe, il faudrait écrire <br\/> afin que sed ne considère pas le "/" de br comme un séparateur entre ses 3 opérandes (motif, remplacement, options).

Au niveau des options, on a potentiellement plusieurs substitutions à faire dans une même ligne, donc il va falloir utiliser l'option g (global).

Passons maintenant à l'expression régulière. On doit réagir sur une majuscule, donc n'importe quel caractère compris entre A et Z, ce qui s'écrit [A-Z]. On va remplacer cette majuscule par <br/>, retour à la ligne (\n), et cette majuscule.

Or, on voit donc que l'on a besoin dans la chaîne de remplacement de savoir sur quelle majuscule on a réagit (typiquement le B de Bonjour, le J de je etc...). Pour cela, il faut dire à sed de mémoriser ce morceau du motif. Ceci se réalise avec l'opérateur \(...\). On peut ainsi extraire un ou plusieurs morceau du motif pour les réutiliser ensuite (et qui seront notés dans la chaîne de remplacement \1, \2, etc...).

C'est pourquoi dans le motif on écrit \([A-Z]\), et cette majuscule est mémorisée dans \1. Ainsi la chaîne de remplacement devient <br/>\n\1.

Seule problème, il ne faut pas réagir sur la première majuscule. Mais ça à première vue je ne vois pas comment faire directement dans le sed, donc on peut imaginer que tu fasses sauter la première ligne du fichier à l'aide de la commande tail.

(mando@velvet) (~) $ tail -n+2 toto > tata

(mando@velvet) (~) $ cat tata
Bonjour monsieur <br/>
Je voudrais un croissant <br/>
Merci monsieur


Bonne chance
1
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
Modifié par lami20j le 18/01/2012 à 20:49
Salut,

Seule problème, il ne faut pas réagir sur la première majuscule.
Peut être comme ça dans ce cas.

lami20j@debian-acer:~$ cat plop 
Bonjour monsieur Je voudrais un croissant Merci monsieur 
lami20j@debian-acer:~$ sed 's%\([A-Z]\)%<br/>\n\1%g' plop 
<br/> 
Bonjour monsieur <br/> 
Je voudrais un croissant <br/> 
Merci monsieur 
lami20j@debian-acer:~$ sed  's%[^^]\([A-Z]\)%<br/>\n\1%g' plop 
Bonjour monsieur<br/> 
Je voudrais un croissant<br/> 
Merci monsieur
lami20j@debian-acer:~$ sed  's%[^\b]\([A-Z]\)%<br/>\n\1%g' plop
Bonjour monsieur<br/>
Je voudrais un croissant<br/>
Merci monsieur



lami20j
0
Merci à tous pour vos réponses et les explications !
0