Découpage chaîne de caractères [Fermé]

Signaler
Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
-
Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
-
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

3 réponses


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
-
?
Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
61
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.
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
Messages postés
35703
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 octobre 2020
5 576
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… ;-))
Utilisateur anonyme >
Messages postés
35703
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 octobre 2020

B="${A%-*}"
Messages postés
35703
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 octobre 2020
5 576 > Utilisateur anonyme
Exact. Merci ;-)
Messages postés
641
Date d'inscription
samedi 17 février 2007
Statut
Membre
Dernière intervention
26 juin 2020
61
Ah oui merci à tous pour toutes ces solutions bien plus élégantes que la mienne.