Deutsch   English   Français   Italiano  
<t6bqdp$2n20$1@cabale.usenet-fr.net>

View for Bookmarking (what is this?)
Look up another Usenet article

Path: ...!news.mixmin.net!aioe.org!news.gegeweb.eu!gegeweb.org!usenet-fr.net!.POSTED!not-for-mail
From: Olivier Miakinen <om+news@miakinen.net>
Newsgroups: fr.comp.os.linux.configuration
Subject: =?UTF-8?Q?Re:_Manipulation_de_cha=c3=aene?=
Date: Sun, 22 May 2022 00:51:37 +0200
Organization: There's no cabale
Lines: 71
Message-ID: <t6bqdp$2n20$1@cabale.usenet-fr.net>
References: <f399de3b-9165-3e25-50ed-80eea97e0e2e@miakinen.net>
 <slrnt8iotm.8pd.lhh+news-no_spam@hercule.home.arpa>
NNTP-Posting-Host: 220.12.205.77.rev.sfr.net
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: 8bit
X-Trace: cabale.usenet-fr.net 1653173497 89152 77.205.12.220 (21 May 2022 22:51:37 GMT)
X-Complaints-To: abuse@usenet-fr.net
NNTP-Posting-Date: Sat, 21 May 2022 22:51:37 +0000 (UTC)
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101
 Firefox/52.0 SeaMonkey/2.49.4
In-Reply-To: <slrnt8iotm.8pd.lhh+news-no_spam@hercule.home.arpa>
Bytes: 3423

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