Trouver les majuscules avec sed
Résolu/Fermé
A voir également:
- Trouver les majuscules avec sed
- Trouver adresse mac - Guide
- Trouver un lieu avec coordonnées gps - Guide
- Comment trouver le mot de passe wifi sur son téléphone - Guide
- Trouver une adresse - Guide
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 662
Modifié par Malekal_morte- le 18/01/2012 à 18:21
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
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
mamiemando
Messages postés
33453
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
6 janvier 2025
7 812
18 janv. 2012 à 18:20
18 janv. 2012 à 18:20
C'est pas tout à fait parfait mais dans l'idée :
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.
Bonne chance
(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
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 569
Modifié par lami20j le 18/01/2012 à 20:49
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
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