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 22/09/2011, 16h17   #1
Membre régulier
 
Inscription : mars 2007
Messages : 78
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 78
Points : 75
Points : 75
Par défaut [SH] Extraction sous-chaine (encore ;-) )

Bonjour,

Je n'arrive pas extraire une sous-chaîne en une seule commande.
Mais avant de me résigner a le faire en plusieurs étape, je vous expose mon pb au cas ou ...


alors dans ma variable j'ai la chaîne suivante
Code :
toto="CREATE TABLE MA_TABLE ("
je voudrais extraire juste la chaîne "MA_TABLE"
Or le mot "Table" peut être écrit en majuscule minuscule ....
la "(" peut être collé ou non a ma chaîne
et évidement il peut y avoir des retours à la ligne entre les mots.

un truc simple en somme ;-)

bon si vous avec une solution en "3" lignes je prend aussi


Merci
alx13 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/09/2011, 19h49   #2
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 alx13 Voir le message
je voudrais extraire juste la chaîne "MA_TABLE"
Or le mot "Table" peut être écrit en majuscule minuscule ....
la "(" peut être collé ou non a ma chaîne
Salut

Code bash :
nomTable=`echo "$toto" |cut -f3 -d' ' |sed -e "s/(//"`


Citation:
Envoyé par alx13 Voir le message
et évidement il peut y avoir des retours à la ligne entre les mots.
Là ça devient un poil plus compliqué. Et en plus suis pas chez-moi donc je peux pas tester mais laisse moi qq minutes et je reviendrai donner une solution
__________________
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 20
Vieux 22/09/2011, 23h03   #3
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,

là, parce que c'est du sh, je verrais bien un coup d'expr "$var" match "motif".

regarde le page d'info
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/09/2011, 08h17   #4
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
Bon désolé pour les "qq minutes", j'ai complètement zappé une fois rentré chez-moi.

Sinon ben en fait la solution est toute simple même si c'est sur plusieurs lignes:
Code bash :
nomTable=`echo $toto |cut -f3 -d' ' |sed -e "s/(//"`
La différence tient aux guillemets autour de $toto. Avec les guillemets le caractère "eol" est pris en compte et donc le cut voit arriver 3 lignes, mais sans eux, il n'est pas pris en compte et le cut voit arriver les 3 lignes jointes en une seule...

Citation:
Envoyé par N_BaH Voir le message
Bonjour,

là, parce que c'est du sh, je verrais bien un coup d'expr "$var" match "motif".
Hey
expr étant une commande externe, ça pourra s'utiliser que ce soit du sh, du csh, du ksh non ???
__________________
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 20
Vieux 23/09/2011, 09h09   #5
Membre régulier
 
Inscription : mars 2007
Messages : 78
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 78
Points : 75
Points : 75
Salut,

Tout d'abord merci à N_BaH et Sve@r pour vos réponses

La solution du couple cut/sed marche bien quand la chaine est sur une seule ligne.
Comme quoi les solutions les plus simples sont souvent les meilleurs

Par contre quand j'ai des "retour chariot" à la ligne dans ma chaîne, ça ne fonctionne pas.

Je vais quand même faire le test dans le script histoire d'être sur.
Et je vous tiens au courant.

Merci encore.
alx13 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/09/2011, 10h42   #6
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Citation:
Envoyé par alx13 Voir le message
Par contre quand j'ai des "retour chariot" à la ligne dans ma chaîne, ça ne fonctionne pas.
Sve@r te l'as pourtant expliqué dans son message précédent, c'est une histoire de guillemets autour de la variable

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ echo "${toto}"
CREATE
TABLE MA_TABLE(
 
$ echo ${toto}
CREATE TABLE MA_TABLE(
 
$ echo "${tata}"
CREATE
TABLE MA_TABLE (
 
$ echo ${tata}
CREATE TABLE MA_TABLE (
 
$ echo $toto | sed 's/\([^ ]* \)\{2\}\([^ ][^(]*\)[ (].*/\2/'
MA_TABLE
 
$ echo $tata | sed 's/\([^ ]* \)\{2\}\([^ ][^(]*\)[ (].*/\2/'
MA_TABLE
 
$
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/09/2011, 10h45   #7
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
Citation:
Envoyé par alx13 Voir le message
Salut,

Tout d'abord merci à N_BaH et Sve@r pour vos réponses

La solution du couple cut/sed marche bien quand la chaine est sur une seule ligne.
Comme quoi les solutions les plus simples sont souvent les meilleurs

Par contre quand j'ai des "retour chariot" à la ligne dans ma chaîne, ça ne fonctionne pas.

Je vais quand même faire le test dans le script histoire d'être sur.
Et je vous tiens au courant.

Merci encore.

sed sait lire les chaines sur plusieurs lignes
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
[fpu@lne ~/tmp] cat > d
a
b
ab
[fpu@lne ~/tmp] sed "s/a.*b/c/" d  # pour changer ab sur une ligne par c
a
b
c
[fpu@lne ~/tmp] sed "N ; s/a.*b/c/" d # pour changer ab sur 2 lignes par c
c
ab
[fpu@lne ~/tmp]
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 23/09/2011, 10h58   #8
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
Citation:
Envoyé par Sve@r
expr étant une commande externe, ça pourra s'utiliser que ce soit du sh, du csh, du ksh non ???
Tout à fait.
Cependant, bash et ksh, avec les double-crochets et le tilde initiant la comparaison avec une regex, peuvent faire "en interne" ce que fait expr.
zsh étant encore plus puissant propose peut-être un autre moyen.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/09/2011, 15h25   #9
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
Bonjour !

Code :
echo "CREATE TABLE\nMA_TABLE(\ntout le reste" | tr -s '\n' ' ' |{ IFS=' (' read create table nomTable autres; echo "${nomTable}" ; }
Note : j'aime pas sh
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/09/2011, 17h11   #10
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
un besoin pro me fait penser à ceci :
Code :
echo "CREATE\tTABLE\nMA_TABLE\r(\ntout le reste"|awk -v RS='' -F'[\n\r[:space:](]' ' { print $3}'
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 23/09/2011, 18h37   #11
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 chardclo Voir le message
un besoin pro me fait penser à ceci :
Code :
1
2
echo "CREATE\tTABLE\nMA_TABLE\r(\ntout le reste"|awk -v RS='' -F'[\n\r[:space:](]' ' {
print $3}'
awk !!! C'est la grosse artillerie ça. Bien sûr quand ça marche c'est sympa mais si on peut utiliser des commandes plus light, alors ça marche plus vite...

Citation:
Envoyé par chardclo Voir le message
Note : j'aime pas sh
C'est vrai que quand on a goûté aux shells plus évolués, on a du mal. Malheureusement t'es pas toujours libre de l'environnement ciblé...
__________________
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 20
Vieux 23/09/2011, 20h45   #12
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
Citation:
Envoyé par Sve@r Voir le message
awk !!! C'est la grosse artillerie ça.
Pas plus que sed à mon sens

Citation:
Envoyé par Sve@r Voir le message
[...]mais si on peut utiliser des commandes plus light, alors ça marche plus vite...

je "milite" également dans ce sens ...C'est d'ailleurs pour cela que ma première proposition était à base de read mais qui s'appuyait sur la sortie de trEt c'est ce qui justifie ma remarque car je le trouve sh "pauvrement" fourni

Citation:
Envoyé par Sve@r Voir le message
C'est vrai que quand on a goûté aux shells plus évolués, on a du mal. Malheureusement t'es pas toujours libre de l'environnement ciblé...
J'en "souffre" au TAF
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 24/09/2011, 15h47   #13
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 chardclo Voir le message
Pas plus que sed à mon sens
Hum... un programme câblé pour comprendre tout un langage algorithmique complet contenant des structures alternatives et répétitives + possibilité de créer des fonctions me semble un poil plus lourd qu'un programme dont le but n'est que de faire des remplacements de texte et suppression de lignes. Parce que tout ce que awk peut faire ça a quand-même un certain poids...
__________________
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
Vieux 26/09/2011, 12h02   #14
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
Oui, je suis d'accord avec toi... mais mesurer cette charge sur une seule action n'est vraiment pas significatif.

Sur de l'itération très volumineuse, j'y apporterai de l'importance....

Pour te donner raison :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ time echo "a"|sed -n '/.*/p' >/dev/null
 
real    0m0.007s
user    0m0.004s
sys     0m0.002s
$ $ time echo "a"|awk '/.*/' >/dev/null
 
real    0m0.007s
user    0m0.004s
sys     0m0.002s
 
$ time for i in {0..10000}; do echo "a"|awk '/.*/'; done >/dev/null
 
real    1m9.101s
user    0m42.878s
sys     0m23.271s
$ time for i in {0..10000}; do echo "a"|sed -n '/.*/p'; done >/dev/null
 
real    0m59.822s
user    0m41.116s
sys     0m21.118s
sachant bien sur que tout dépend des processus en cours d'exécution et de priorités au moment de l'exécution des instructions.

enfin bon, c'est un éternel débat
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 11h50   #15
Membre régulier
 
Inscription : mars 2007
Messages : 78
Détails du profil
Informations personnelles :
Âge : 33
Localisation : Suisse

Informations forums :
Inscription : mars 2007
Messages : 78
Points : 75
Points : 75
En tout cas merci a tous pour vos réponses

Moi qui pensais que c’était une question bateau, j'ai bien fait de poser la question



Merci encore
@+
alx13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 21h46   #16
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 alx13 Voir le message
En tout cas merci a tous pour vos réponses

Moi qui pensais que c’était une question bateau, j'ai bien fait de poser la question



Merci encore
@+
Ben justement c'est une question bateau !!! C'est pour ça qu'on peut tous se laisser aller à donner chacun une version différente en disant, chacun de son coté, que sa version personnelle est plus rapide et plus concise que celle des autres
__________________
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é Cette discussion est résolue.
Outils de la discussion



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


 
 
 
 
Partenaires

Hébergement Web