OVH Cloud OVH Cloud

découpage de chaine

5 réponses
Avatar
gamotte
Bonjour,

J'ai un fichier dont les lignes sont de la forme

champ1champ2...champn

o=F9 chaque champ peut =EAtre identifi=E9 par une expression r=E9guli=E8re
(diff=E9rente pour chaque champ).

Quel outil pourrait me permettre de d=E9couper ma chaine selon les
diff=E9rents champs de fa=E7on optimale (c-=E0-d en =E9vitant de faire
plusieurs passes) ?

Merci

5 réponses

Avatar
Stephane Chazelas
On 25 Sep 2006 05:27:36 -0700, wrote:
Bonjour,

J'ai un fichier dont les lignes sont de la forme

champ1champ2...champn

où chaque champ peut être identifié par une expression régulière
(différente pour chaque champ).

Quel outil pourrait me permettre de découper ma chaine selon les
différents champs de façon optimale (c-à-d en évitant de faire
plusieurs passes) ?
[...]


sed 's/champ[0-9]/&
/g'

$ echo champ1champ2 | perl -lne 'print "Got "$_"" for (/champd/g)'
Got "champ1"
Got "champ2"

--
Stephane

Avatar
gamotte


sed 's/champ[0-9]/&
/g'

$ echo champ1champ2 | perl -lne 'print "Got "$_"" for (/champd/g)'
Got "champ1"
Got "champ2"



Merci,

Je crois que je n'ai pas été assez précis, désolé. En fait, je
voudrais
récupérer chaque champ dans une variable distincte pour des
opérations
ultérieures.

Par exemple, si j'ai une ligne de la forme

AJYGJHkjhgjhgjhg870982

j'ai trois champs distincts identifiés par exemple par

[A-Z]+, [a-z]+ et [0-9]+

Est-il possible de récupérer en une seule commande les variables

maj="AJYGJH"
min="kjhgjhgjhg"
chfr="870982"

Avatar
Stephane Chazelas
On 25 Sep 2006 06:20:59 -0700, wrote:
[...]
sed 's/champ[0-9]/&
/g'

$ echo champ1champ2 | perl -lne 'print "Got "$_"" for (/champd/g)'
Got "champ1"
Got "champ2"



Merci,

Je crois que je n'ai pas été assez précis, désolé. En fait, je
voudrais
récupérer chaque champ dans une variable distincte pour des
opérations
ultérieures.

Par exemple, si j'ai une ligne de la forme

AJYGJHkjhgjhgjhg870982

j'ai trois champs distincts identifiés par exemple par

[A-Z]+, [a-z]+ et [0-9]+

Est-il possible de récupérer en une seule commande les variables

maj="AJYGJH"
min="kjhgjhgjhg"
chfr="870982"
[...]


string=AJYGJHkjhgjhgjhg870982
eval "$(
printf '%sn' "$string" |
LC_ALL=C sed -n '
s/^([A-Z]{1,})([a-z]{1,})([0-9]{1,})$/maj=1 min=2 chfr=3/p'
)"

Mais c'est plus un boulot pour perl (ou tout autre outil de text
processing) que pour un shell.

($maj, $min, $chfr) = $string =~ /^([A-Z]+)([a-z]+)([0-9]+)$/;

--
Stephane


Avatar
gamotte


string=AJYGJHkjhgjhgjhg870982
eval "$(
printf '%sn' "$string" |
LC_ALL=C sed -n '
s/^([A-Z]{1,})([a-z]{1,})([0-9]{1,})$/maj=1 min=2 chfr=3/p'
)"

Mais c'est plus un boulot pour perl (ou tout autre outil de text
processing) que pour un shell.

($maj, $min, $chfr) = $string =~ /^([A-Z]+)([a-z]+)([0-9]+)$/;



Merci beaucoup

Avatar
Stan
a écrit dans le message de
news:

Par exemple, si j'ai une ligne de la forme

AJYGJHkjhgjhgjhg870982

j'ai trois champs distincts identifiés par exemple par

[A-Z]+, [a-z]+ et [0-9]+

Est-il possible de récupérer en une seule commande les variables

maj="AJYGJH"
min="kjhgjhgjhg"
chfr="870982"



Bonjour,

en AWK, c'est assez simple, de plus, si vous
souhaitez effectuer des traitements suplémentaires
par la suite, AWK est tout indiqué pour ça.
( c'est très intuitif d'utilisation ).


echo "AGHJHSdsdshjh778788" | awk '


{
match($0, /[A-Z]+/);
maj = substr($0, RSTART, RLENGTH);

match($0, /[a-z]+/);
min = substr($0, RSTART, RLENGTH);

match($0, /[0-9]+/);
chfr = substr($0, RSTART, RLENGTH);

}

END{
print maj;
print min;
print chfr;
}

'

--
-Stan