Re: Manipulation de chaîne

Liste des GroupesRevenir à fcol configuration 
Sujet : Re: Manipulation de chaîne
De : om+news (at) *nospam* miakinen.net (Olivier Miakinen)
Groupes : fr.comp.os.linux.configuration
Date : 22. May 2022, 00:51:37
Autres entêtes
Organisation : There's no cabale
Message-ID : <t6bqdp$2n20$1@cabale.usenet-fr.net>
References : 1 2
User-Agent : Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0 SeaMonkey/2.49.4
Bonjour Jacques,

Le 22/05/2022 00:12, Jacques L'helgoualc'h a écrit :
>
Bien sûr je pourrais écrire "${v:0:1}\.${v:1:1}\.${v:2:1}\.${v:3}", mais
y a-t-il plus simple ?
 
 $ echo 2718281828459045 | \
sed -nre '/^[0-9]+$/!{s/^/Fuck /p;q};:x;s/([0-9])([0-9])/\1\.\2/;/(\\.[0-9]){3}/{p;q};bx'
2\.7\.1\.8281828459045

Ouah ! Je n'appellerais pas ça « plus simple », mais avec l'aide de
« man sed » tu viens de me faire découvrir la puissance de cette
commande que j'étais loin de soupçonner !

Je viens d'apprendre :
- le « ! » pour ne pas exécuter une commande si l'adresse ne matche pas ;
- les blocs de commandes avec « { » et « } » ;
- l'option -n pour supprimer l'auto-print ;
- le « p;q » pour afficher le résultat puis quitter ;
- les boucles, avec un label (:x) et un branchement (bx).

Je connaissais le reste, mais c'était un usage tellement limité !

 
Sans le contrôle initial, plus simple :
 
sed -nre ':x;s/([0-9])([0-9])/\1\.\2/;/\\..\\..\\./{p;q};bx'
 
Il faudrait insérer un « /[0-9][0-9]/!{p;Q} », ou modifier le test initial,
si tu es assez pervers pour essayer un nombre de moins de 4 chiffres :)

Oui et oui (et non, je ne suis pas assez pervers pour ça, des tests
préliminaires évitent d'avoir des nombres plus petits).

 
 
 
P.-S. : J'ai la même question, mais pour le cas où chaque chiffre (sauf
éventuellement le dernier) doit être suivi de la séquence.
 
$ echo 2718281828459045 | \
sed -nre ':x;s/([0-9])([0-9])/\1\.\2/g;tx;p;q'
2\.7\.1\.8\.2\.8\.1\.8\.2\.8\.4\.5\.9\.0\.4\.5

Ok, du coup j'ai appris aussi les branchements conditionnels avec t ou T.

 
Il faut deux passes du s///g d'insertion (ou accepter/supprimer un point final) :
 
 $ echo 2718281828459045 | \
sed -nre ':x;s/([0-9])([0-9])/\1\.\2/gp;tx;q'
2\.71\.82\.81\.82\.84\.59\.04\.5
2\.7\.1\.8\.2\.8\.1\.8\.2\.8\.4\.5\.9\.0\.4\.5

Ok.

Le plus simple :
 
echo 2718281828459045 |sed -e 's/[0-9]/&\./g;s/\.$//'
2\.7\.1\.8\.2\.8\.1\.8\.2\.8\.4\.5\.9\.0\.4\.5

Bon sang mais c'est bien sûr ! Je m'en veux de ne pas y avoir pensé
moi-même, parce que je connaissais tout ce qu'il fallait pour arriver
à cette solution.

Un grand merci à toi, c'est vraiment génial cette commande.


--
Olivier Miakinen

Date Sujet#  Auteur
21 May 22 * Manipulation de chaîne4Olivier Miakinen
22 May 22 `* Re: Manipulation de chaîne3Jacques L'helgoualc'h
22 May 22  `* Re: Manipulation de chaîne2Olivier Miakinen
22 May 22   `- Re: Manipulation de chaîne1Jacques L'helgoualc'h

Haut de la page

Les messages affichés proviennent d'usenet.

NewsPortal