Découpage chaîne de caractères

zatox Messages postés 640 Date d'inscription   Statut Membre Dernière intervention   -  
zatox Messages postés 640 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, dans une chaine j'ai ceci:
124567-5-08-12-127-45
Je voudrais extraire tout ce qui se trouve devant le cinquième - c'est à dire obtenir
124567-5-08-12-127
Ou bien tout ce qui se trouve devant le quatrième - c'est à dire obtenir
124567-5-08-12

Merci pour votre réponse
A voir également:

3 réponses

Utilisateur anonyme
 
salut,

« devant le cinquième
-
», et « devant le quatrième
-
»
ces nombres sont fixes, ou ou s'agit-il du dernier et de l'avant-dernier
-
?
c'est-à-dire, la chaîne est-elle susceptible de ne pas avoir toujours ce format, et comporter d'autres
-
?
0
zatox Messages postés 640 Date d'inscription   Statut Membre Dernière intervention   66
 
Bonjour, merci pour ta réponse, non la chaîne n'a pas forcément toujours le même format par exemple ça peut-être:
12-128-1-54-1258-1 ou bien
123589-12-258-254879-2-58

Bon j'ai trouvé une solution mais qui n'est pas très élégante:

#! /bin/bash
nb_num=4
while read ligne
do
tableau=( ${ligne//-/ } )
if [ "$nb_num" == 5 ]
then
new_line="${tableau[0]} ${tableau[1]} ${tableau[2]} ${tableau[3]} ${tableau[4]}"
fi
if [ "$nb_num" == 4 ]
then
new_line="${tableau[0]} ${tableau[1]} ${tableau[2]} ${tableau[3]}"
fi
if [ "$nb_num" == 3 ]
then
new_line="${tableau[0]} ${tableau[1]} ${tableau[2]}"
fi
if [ "$nb_num" == 2 ]
then
new_line="${tableau[0]} ${tableau[1]}"
fi

echo $new_line >> new_fichier.txt
cpt_fichier_txt=$(($cpt_fichier_txt + 1));

done < fichier.txt

echo $new_line


En fonction de la valeur que je donne à nb_num je récupère la chaîne que je veux mais il doit y avoir mieux que ça je pense.

Merci pour votre aide.
0
Utilisateur anonyme
 
c'est bien.
$ var='123589-12-258-254879-2-58'
$ ar=( ${var//-/ } )
$ n=4
$ echo ${ar[@]::$n}
123589 12 258 254879
$ n=3
$ echo ${ar[@]::$n}
123589 12 258
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431
 
Salut,

On peut aussi…

$ A="124567-5-08-12-127-45"

$ grep -o '\([^-]*-\)\{5\}' <<< "${A}"
124567-5-08-12-127-

$ grep -o '\([^-]*-\)\{4\}' <<< "${A}"
124567-5-08-12-

$ grep -o '\([^-]*-\)\{3\}' <<< "${A}"
124567-5-08-

$ echo "${A%-*}"
124567-5-08-12-127

$ B="$(echo ${A%-*})"

$ echo "${B%-*}"
124567-5-08-12

Ce n'est pas parfait avec "grep", mais bon… ;-))
0
Utilisateur anonyme > zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention  
 
B="${A%-*}"
0
zipe31 Messages postés 36402 Date d'inscription   Statut Contributeur Dernière intervention   6 431 > Utilisateur anonyme
 
Exact. Merci ;-)
0
zatox Messages postés 640 Date d'inscription   Statut Membre Dernière intervention   66
 
Ah oui merci à tous pour toutes ces solutions bien plus élégantes que la mienne.
0