Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/11/2011, 17h48   #1
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 27
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 27
Points : 11
Points : 11
Par défaut Extraire une chaine derrière un caractère défini

Bonjour à tous

Je suis relativement mauvais en programmation et je ne sais trop comment m'y prendre pour réaliser ce que l'on me demande...

Je dispose d'une variable qui contient une chaine de type :

INDEX_NAME ------------------------------ TABLE~1 TABLE~2 TABLE~3 TABLE~4

(il s'agit en fait de la liste index compris dans une TABLE oracle)

Je dois faire en sorte de mettre chacun des "TABLE~X" dans une variable séparée sachant que :
-TABLE est toujours la même chaine MAIS mon script doit être adaptable à d'autres TABLES, la longueur de cette chaine est donc variable.
-Le nombre ~X peut aller de 1 à .... beaucoup

J'ai remarqué qu'il y avait un espace devant chacune des valeurs, cela pourrait éventuellement être exploité, si ce n'est qu'il me ressortira également ------------------------------ puisqu'il est précédé d'un espace, il faudra donc ne pas le prendre en compte.

Le seul caractère réellement intéressant est ~ car il sera toujours présent, ceci dit je ne connais pas la longueur des chaines qui le précèdent et le succèdent...

Je ne sais trop comment me défaire de ce bourbier !

Merci d'avance pour votre aide
shanod est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/11/2011, 17h58   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

Citation:
Je dispose d'une variable qui contient une chaine de type :

INDEX_NAME ------------------------------ TABLE~1 TABLE~2 TABLE~3 TABLE~4
Comment l'obtiens-tu ?

Citation:
Je dois faire en sorte de mettre chacun des "TABLE~X" dans une variable séparée
pour quoi faire ?

quel shell ?
Si tu peux utiliser autre chose qu'un shell strictement POSIX, il est probablement possible d'utiliser un tableau.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/11/2011, 21h05   #3
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par shanod Voir le message
Bonjour à tous

Je suis relativement mauvais en programmation et je ne sais trop comment m'y prendre pour réaliser ce que l'on me demande...

Je dispose d'une variable qui contient une chaine de type :

INDEX_NAME ------------------------------ TABLE~1 TABLE~2 TABLE~3 TABLE~4

(il s'agit en fait de la liste index compris dans une TABLE oracle)

Je dois faire en sorte de mettre chacun des "TABLE~X" dans une variable séparée sachant que :
-TABLE est toujours la même chaine MAIS mon script doit être adaptable à d'autres TABLES, la longueur de cette chaine est donc variable.
-Le nombre ~X peut aller de 1 à .... beaucoup

J'ai remarqué qu'il y avait un espace devant chacune des valeurs, cela pourrait éventuellement être exploité, si ce n'est qu'il me ressortira également ------------------------------ puisqu'il est précédé d'un espace, il faudra donc ne pas le prendre en compte.

Le seul caractère réellement intéressant est ~ car il sera toujours présent, ceci dit je ne connais pas la longueur des chaines qui le précèdent et le succèdent...

Je ne sais trop comment me défaire de ce bourbier !

Merci d'avance pour votre aide
Bonjour

T'es obligé de faire ça en shell ? Parce qu'il y a des langages de scripts bien plus puissants.

Par exemple en Python

Code python :
1
2
3
4
5
6
7
8
9
>>> chaine="INDEX_NAME ------------------------------ TABLE~1 TABLE~2 TABLE~3 TABLE~4"
 
>>> table=[x for x in chaine.split(" ") if x.startswith("TABLE")]
 
>>> table
['TABLE~1', 'TABLE~2', 'TABLE~3', 'TABLE~4']
 
>>> table[2]
'TABLE~3'
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2011, 17h17   #4
Candidat au titre de Membre du Club
 
Inscription : avril 2003
Messages : 27
Détails du profil
Informations forums :
Inscription : avril 2003
Messages : 27
Points : 11
Points : 11
Merci pour vos réponses

Citation:
Envoyé par N_BaH Voir le message
Bonjour,

Comment l'obtiens-tu ?

pour quoi faire ?

quel shell ?
Si tu peux utiliser autre chose qu'un shell strictement POSIX, il est probablement possible d'utiliser un tableau.
J'obtiens cette chaine par une requête SQL qui me renvoie tous les index existant pour une table Oracle spécifiée.

Car je dois réorganiser la table en question ainsi que tous ses index (et ceci doit être dynamique donc le nom de ma table ainsi que le nom de tous les index doit être variabilisé.)

J'utilise du KSH et je suis contraint d'utiliser ce langage.

Après différents tests, je remarque que le début de ma chaine :
INDEX_NAME ------------------------------
est de longueur fixe, je peux donc sans problème la faire sauter.
Je me retrouverai alors avec :
TABLE~1 TABLE~2 TABLE~3 TABLE~4...
qui doivent aller se caler dans autant de variables que de "TABLE~X"

Je dispose d'une requête qui me compte le nombre d'index donc je peux savoir jusqu'à quel nombre va mon X.

Serait-il possible de remplacer chaque espace par un saut de ligne et ensuite lire chaque ligne de ma variable (je ne veux pas passer par un fichier).
shanod est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/11/2011, 18h00   #5
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Ça tombe bien, ksh supporte les tableaux !

on peut essayer :
Code pour alimenter le tableau :
1
2
typeset -a tableau
ta_requeteSQL | while read line; do tableau+=( "$line" ); done
Code pour visualiser le tableau sans headers :
printf '%s\n' "${tableau[@]:2}"
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/11/2011, 11h56   #6
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 538
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 538
Points : 7 754
Points : 7 754
N_BaH fait une erreur, c'est suffisament rare pour être repéré :
on ne dit pas tanbleau mais tableau
frp31 est actuellement connecté   Envoyer un message privé Réponse avec citation 02
Vieux 23/11/2011, 23h00   #7
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
Localisation : France, Oise (Picardie)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par shanod Voir le message
Je me retrouverai alors avec :
TABLE~1 TABLE~2 TABLE~3 TABLE~4...
qui doivent aller se caler dans autant de variables que de "TABLE~X"

Je dispose d'une requête qui me compte le nombre d'index donc je peux savoir jusqu'à quel nombre va mon X.

Serait-il possible de remplacer chaque espace par un saut de ligne et ensuite lire chaque ligne de ma variable
Pas la peine
Code bash :
1
2
3
4
for i in TABLE~1 TABLE~2 TABLE~3 TABLE~4...
do
    echo "$i"
done

ou bien
Code bash :
1
2
3
4
5
6
set TABLE~1 TABLE~2 TABLE~3 TABLE~4...
echo "$#"     => nombre de "TABLE~X"
for i in $*
do
    echo "$i"
done

Citation:
Envoyé par shanod Voir le message
(je ne veux pas passer par un fichier).
Et tu as bien raison. Quand on peut éviter...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 13h48.


 
 
 
 
Partenaires

Hébergement Web