Découpage chaîne de caractères

Fermé
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 - 17 févr. 2018 à 15:10
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 - 18 févr. 2018 à 13:34
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
17 févr. 2018 à 17:19
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 samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 65
18 févr. 2018 à 10:37
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
18 févr. 2018 à 11:48
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
18 févr. 2018 à 11:53
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 dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
18 févr. 2018 à 12:17
B="${A%-*}"
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407 > Utilisateur anonyme
18 févr. 2018 à 12:18
Exact. Merci ;-)
0
zatox Messages postés 640 Date d'inscription samedi 17 février 2007 Statut Membre Dernière intervention 26 juin 2020 65
18 févr. 2018 à 13:34
Ah oui merci à tous pour toutes ces solutions bien plus élégantes que la mienne.
0