Path: csiph.com!pasdenom.info!.POSTED.2a01:e0a:4ee:1ac0:157:6458:2402:e16c!not-for-mail From: kurtz le pirate Newsgroups: fr.comp.os.unix Subject: Re: Shell : extraire d'une chaine plusieurs sous-chaines Date: Thu, 27 Nov 2025 10:59:54 +0100 Organization: compagnie de la banquise Message-ID: <10g97eq$ndi$1@rasp.pasdenom.info> References: <10g4rbq$2i1$1@cabale.usenet-fr.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Injection-Date: Thu, 27 Nov 2025 09:59:54 -0000 (UTC) Injection-Info: rasp.pasdenom.info; posting-account="kurtzlepirate@usenet"; posting-host="2a01:e0a:4ee:1ac0:157:6458:2402:e16c"; logging-data="23986"; mail-complaints-to="abuse@pasdenom.info" User-Agent: Mozilla Thunderbird Cancel-Lock: sha1:u5KF8b4RAjw+TLuYwYDo248z4R8= sha256:bwTTjRzysTem+o6bCtwyp+Itmv5UurP/jlzi84LZsqE= sha1:xeb3JyxwCszOxB0KP46YNDpHQYg= sha256:eS/by1sOIPU980ycAWTWLTy3074l05pLfKxoLvSZV9w= Content-Language: en-US In-Reply-To: <10g4rbq$2i1$1@cabale.usenet-fr.net> Xref: csiph.com fr.comp.os.unix:8146 On 25/11/2025 19:08, Olivier Miakinen wrote: > > Bonjour, > > Dans un script ksh, je cherche la façon la plus élégante d'extraire > d'une chaine plusieurs sous-chaines. Le cas réel est plus complexe > que celui que je vais exposer, mais je saurai extrapoler ensuite. > > > Supposons que j'ai une chaine constituée d'1 ou plusieurs lettres, > puis 1 chiffre, puis optionnellement d'autres lettres, puis encore > 1 ou plusieurs chiffres. Pour fixer les idées, disons que la chaine > répondrait à la regex suivante : > /[a-z]+[0-9][a-z]*[0-9]+/ > > Je voudrais extraire chaque partie dans une variable différente. > Quelques exemples : > s="test1xyz27" -> v1="test" v2="1" v3="xyz" v4="27" > s="aa9toto000" -> v1="aa" v2="9" v3="toto" v4="000" > s="x012" -> v1="x" v2="0" v3="" v4="12" > > Bien sûr je sais le faire en autant d'étapes qu'il y a de parties > à récupérer, en obtenant les variables l'une après l'autre. Mais > existe-t-il un moyen plus direct ? > ... j'ai fait un test sur avec ces valeurs : source text : aaaaa111bb22cccccc3333dd44e5f666666 match pattern : ([a-zA-Z]+|\d+) result : $matches Array: ( [0] => Array ( [0] => aaaaa [1] => 111 [2] => bb [3] => 22 [4] => cccccc [5] => 3333 [6] => dd [7] => 44 [8] => e [9] => 5 [10] => f [11] => 666666 ) [1] => Array ( [0] => aaaaa [1] => 111 [2] => bb [3] => 22 [4] => cccccc [5] => 3333 [6] => dd [7] => 44 [8] => e [9] => 5 [10] => f [11] => 666666 ) ) Avec l'explication : ---------------------------------------------------------------------- ( group and capture to \1: ---------------------------------------------------------------------- [a-zA-Z]+ any character of: 'a' to 'z', 'A' to 'Z' (1 or more times (matching the most amount possible)) ---------------------------------------------------------------------- | OR ---------------------------------------------------------------------- \d+ digits (0-9) (1 or more times (matching the most amount possible)) ---------------------------------------------------------------------- ) end of \1 ---------------------------------------------------------------------- ) end of grouping ---------------------------------------------------------------------- Ca peut te donner une piste ? ps : Je n'est pas compris pourquoi il y a deux array (identiques). -- kurtz le pirate compagnie de la banquise