Trouver les majuscules avec sed
Résolu
marc
-
marc -
marc -
Bonjour à tous,
J'ai besoin de traiter une ligne en faisant un retour à la ligne à chaque majuscule et ajouter une balise :
exemple :
qui devrait donner :
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 />
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 />
A voir également:
- Trouver les majuscules avec sed
- Trouver adresse mac - Guide
- Comment trouver le mot de passe wifi sur son téléphone - Guide
- Ou trouver l'adresse ip - Guide
- Trouver un film sans le titre - Télécharger - Divers TV & Vidéo
- Trouver un lieu avec coordonnées gps - Guide
4 réponses
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
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
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