Rechercher : dans
Par :

Extraction chaîne de caractères dans Shell

Dernière réponse le 23 aoû 2007 à 19:19:39 PatMh, le 2 jun 2007 à 12:18:55 
 Signaler ce message aux modérateurs

Bonjour,
J'ai besoin d'une petite aide sous shell, svp.
Je désire extraire les caractères 1 par 1 ou par bloc (caract 2 à 5 par exemple) dans le contenu de cette chaîne de caractères suivante.
TEST=/etc/machin:/etc/truc
Mon intention réelle est de récupérer
/etc/machin dans une variable
/etc/truc dans une autre variable.
Je pense utiliser une boucle for sachant le nombre de caractères par len=${#TEST}

Merci de votre aide pour mettre dans la bonne voie.
@+
Pat

Configuration: Windows XP
Internet Explorer 7.0
Ubuntu 6.10

Meilleures réponses pour « Extraction chaîne de caractères dans Shell » dans :
Javascript - Concaténation de chaînes de caractères VoirLe terme "concaténer" signifie joindre deux chaînes bout à bout pour n'en former qu'une seule. Dans la plupart des langages tels que PHP, la concaténation se fait avec le caractère ".". En javascript, il suffit d'utiliser le caractère plus (+) ou...
PHP - Nettoyer une chaîne de caractères VoirVoici une fonction en PHP qui peut être assez pratique, surtout quand on fait de l'URL Rewriting. Cette fonction permet de transformer les caractères de n'importe quelle chaîne de caractères en chaîne non accentuée, en enlevant les caractères...
Les chaînes de caractères en C++ VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C++, une...
Langage C - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractères ? Une chaîne de caractères (appelée string en anglais) est une suite de caractères, c'est-à-dire un ensemble de symboles faisant partie du jeu de caractères, défini par le code ASCII. En langage C, une chaîne...
Javascript - Les chaînes de caractères VoirQu'est-ce qu'une chaîne de caractère Une chaîne de caractère est, comme son nom l'indique, une suite de caractères. On la représente par la suite de caractères encadrée par des guillemets simples (') ou doubles ("), sachant que les deux types de...

1

jipicy, le 2 jun 2007 à 12:23:26

Salut,

[jp@MDK tmpfs]$ TEST="/etc/machin:/etc/truc"

[jp@MDK tmpfs]$ echo ${TEST#*:}
/etc/truc

[jp@MDK tmpfs]$ echo ${TEST%:*}
/etc/machin

[jp@MDK tmpfs]$
;-))
Z'@+...che.
JP : Zen, my Nuggets ! ;-)
Le savoir n'est bon que s'il est partagé.

Répondre à jipicy

2

lami20j, le 2 jun 2007 à 12:27:21

Salut,

$ TEST=/etc/machin:/etc/truc
$ MACHIN=${TEST%%:*}
$ TRUC=${TEST##*:}
$ echo $MACHIN
/etc/machin
$ echo $TRUC
/etc/truc
lami20j

Répondre à lami20j

3

PatMh, le 2 jun 2007 à 13:04:51

Salut

Merci de vos réponses.
J'ai fait les manips mais je ne comprends pas tout.
Pourriez-vous m'éclairer un petit peu, svp ?
J'ai complété ma variable pour pouvoir traiter un cas qui serait ni en début et ni en fin de chaîne.
Ce qui donne :
TEST=/etc/machin:/etc/truc:/etc/bidule
J'ai donc fait
$ machin=${TEST%%:*}
$ echo machin
$ /etc/machin

$ truc=${TEST%:*}
$ echo truc
$ /etc/machin:/etc/truc

$ bidule=${TEST##:*}
$ echo bidule
$ /etc/bidule

Je pense avoir compris que % correspond à un bloc et que quand on met # on saute autant de bloc ?

Mais comment fait-on pour extraire du 2ème au 5ème caractère dans TEST, svp ?
Mon intention est de traiter la chaîne en commençant de n'importe où et en prenant un ou plusieurs caractères.
Cela pourra me servir pour srcuter une chaîne caratère par caractère ou bien en prélever qu'une partie bien définie.
Et enfin avec vos explications complémentaires sur l'usage de % et # je srai débloqué.

Merci encore pour vos compléments.
Pat

Répondre à PatMh

4

lami20j, le 2 jun 2007 à 13:09:20

lami20j@debian:~$ TEST=/etc/machin:/etc/truc
lami20j@debian:~$ echo ${TEST:1:3}
etc
Regarde dans la faq pour les explications
le remplacement de variables en shell bash lami20j

Répondre à lami20j

5

PatMh, le 2 jun 2007 à 15:26:45

Merci de ton aide lami20j
j'ai tapé les lignes :
$ TEST=/etc/machin:/etc/truc
$ echo ${TEST:1:3}
et cela me retourne
Syntax error: Bad substitution

J'ai fouiné dans les différentes faq mais sans succés.

Merci encore de ton aide, stp.
Pat

Répondre à PatMh

6

lami20j, le 2 jun 2007 à 15:37:35

Salut,

tu dois faire une erreur quelque part
fait une imprimé de ton écran pour voir ce que tu tape exactement
voilà chez moi http://cjoint.com/?gcpKzVFaiw lami20j

Répondre à lami20j

8

PatMh, le 2 jun 2007 à 16:25:57

Salut,

J'ai du nouveau.
J'ai tapé les lignes sur vi (et non pas en programmation)
et j'ai bien obtenu etc

J'ai oublié de te dire que je rédige en shell
(début de programme par #!/bin/sh)

Si dans mon programme je tape la ligne
TEST=/etc/machin:/etc/truc:/etc/bidule

Comment faire pour extraire du caractère 2 à 7 par exemple, stp ?


Bon, je débute ... et je vais te poser une question stupide mais tant pis !
C'est hors sujet et je m'en excuse par avanace, c'est exceptionnel.

J'ai des problèmes avec l'éditeur vi.
C'est à dire qu'à mon centre de formation, quand j'appuie sur la touche Ech puis sur la touche i
je passe en mode insertion et le message s'affiche et je peux bosser correctement.
Ici chez moi, ce n'est pas le cas, le vi ne réagit pas pareil.
Par exemple { ressemble à un trait vertical ondulé ... et les commandes ne répondent pas comme sur ma machine à mon centre de formation.

J'ai manipé aussi le terminal pour comprendre et j'ai vu qu'il y a différents codages de caractères :
Locale courante UTF-8
Europe centrale (Windows 1250)
Europe centre (ISO-8859-2)
Europe centrale (IBM852)
Lequel je prends, stp ?

Donc, je programme sous l'éditeur.
Là, toutes les commandes claviers sont correctes.

Merci de ton éclairage.
Désolé de t'embêter avec mes problèmes.

Pat

Répondre à PatMh

9

lami20j, le 2 jun 2007 à 16:31:29

lami20j@debian:~$ TEST=/etc/machin:/etc/truc:/etc/bidule
lami20j@debian:~$ echo ${TEST:1:6}
etc/ma


J'ai des problèmes avec l'éditeur vi.
C'est à dire qu'à mon centre de formation,


je pense qu'à ton centre de formation tu utilises vim et pas vi
affiche le résultat de la commande
whereis vi{,m}
choisi Locale courante UTF-8
lami20j

Répondre à lami20j

10

PatMh, le 2 jun 2007 à 17:14:01

Lami20j,

j'ai tapé ces lignes de commandes dans mon éditeur :
TEST=/etc/machin:/etc/truc:/etc/bidule
echo ${TEST:1:6}

Puis, par Ctl Alt F1 j'ai lancé mon script.
Le résultat est Syntax error: Bad subsititution
Je ne vois pas mon erreur.

Dans la même fenêtre, j'ai lancé la commande whereis vi{,m} :
rootk@patrick-ubuntu:~/shell# whereis vi{,m}
vi: /usr/bin/vi /usr/X11R6/bin/vi /usr/bin/X11/vi /usr/share/man/man1/vi.1.gz
vim: /usr/bin/vim /usr/bin/vim.tiny /etc/vim /usr/X11R6/bin/vim /usr/X11R6/bin/vim.tiny /usr/bin/X11/vim /usr/bin/X11/vim.tiny /usr/share/vim /usr/share/man/man1/vim.1.gz

Effectivement, j'ai bien noté à mon centre au sujet de l'éditeur vim.
Je viens de faire à l'instant apt-get install vim mais cela ne fonctionne pas. je pense qu'il me faut la liaison internet et comme ce n'est pas encore installé sur l'autre machine ...

Si tu es encore dispo pour m'aider sur mon pb de variable, je t'en remercie par avance.
Pat

Répondre à PatMh

11

lami20j, le 2 jun 2007 à 17:26:59

Pour le script il n'y a pas d'erreur

En ce qui concerne vim, il est déjà installé sur ton OS
vim: /usr/bin/vim

Tu n'as qu'à ouvrir les fichiers avec vim et pas avec vi

Tant que tu ne m'affiche pas exactement ce que tu fais, par exemple un imprimé écran je ne peux rien faire. lami20j

Répondre à lami20j

12

PatMh, le 2 jun 2007 à 18:31:58

Voici mon bout de programme :
http://cjoint.com/?gcsCcQR3Mu

L'écran de mon retour d'exécution du script :
http://cjoint.com/?gcsEH6xgso

Merci de ton aide.

Pat

Répondre à PatMh

13

lami20j, le 2 jun 2007 à 18:45:13

Je vois que l'erreur est à la ligne 124
affiche le résultat de la commande

sed '120,130!d' ton_script
--
lami20j

Répondre à lami20j

14

PatMh, le 2 jun 2007 à 19:05:02

Le résultat est :
sed: -e expression n°1, caractère 4: commande inconnue: `.'

est-ce par ce qu'il y a des caractères spéciaux comme / que cela ne fonctionne pas ?

Répondre à PatMh

15

lami20j, le 2 jun 2007 à 19:14:08

Voilà ce que j'ai moi

lami20j@debian:~$ perl -ne 'print if 1 .. 5' .bashrc
# .bashrc

# User specific aliases and functions

# Source global definitions
lami20j@debian:~$ sed '1,5!d' .bashrc
# .bashrc

# User specific aliases and functions

# Source global definitions
lami20j

Répondre à lami20j

16

PatMh, le 2 jun 2007 à 19:23:05

Effectivement, ce n'est pas la même réponse.

Je vais repartir sur un fichier neuf et maniper.
Je pense que je trouverai l'erreur en cours de route.
Enfin, j'espère !
Si de ton côté tu as du neuf, merci par avance.

A plus tard lami20j et je te remercie très sincérement de ta patience et de ton aide.

Bien amicalement,

Pat

Répondre à PatMh

17

lami20j, le 2 jun 2007 à 19:26:53

Salut,

Si de ton côté tu as du neuf, merci par avance.

je ne peux rien avoir de neuf, tant que je n'ai pas les réponses à mes questions :-))
pour simplifier les choses je te propose de m'envoyer ton script par mail (voir mon profil)
sinon exécute le script avec sh -x ou sh -xv pour dépister la vraie erreur

lami20j@debian:~$ cat ccm.sh
#!/bin/bash
TEST=/etc/machin:/etc/truc:/etc/bidule
echo ${TEST:1:6}
lami20j@debian:~$ sh -x ccm.sh
+ TEST=/etc/machin:/etc/truc:/etc/bidule
+ echo etc/ma
etc/ma
lami20j@debian:~$ sh -vx ccm.sh
#!/bin/bash
TEST=/etc/machin:/etc/truc:/etc/bidule
+ TEST=/etc/machin:/etc/truc:/etc/bidule
echo ${TEST:1:6}
+ echo etc/ma
etc/ma


lami20j

Répondre à lami20j

18

Fred, le 23 aoû 2007 à 10:51:03

Bonjour, excusez moi d'intervenir sur ce post mais j'ai un problème qui se rapproche de ceux traités ici, si qqun est dans le coin pour m'aider, je vous remercie grandement :)
J'ai besoin d'extraire une chaine de caractère et j'essaie d'utiliser la syntaxe indiquée ici.
Voici mon script :
echo "resultat"
echo $env
echo "extraction"
echo ${env:2:2}
et ça ne marche pas, voici ce qui est produit :
resultat
MT0707
extraction
test3[7] : ${env:2:2} : 0403-011 substitution non valide pour cette commande

Malgrès tout votre post, je ne comprend vraiment pas comment je peux extraire une chaine de caractère incluse dans une autre chaine de caractères ...

Merci

Répondre à Fred

19

lami20j, le 23 aoû 2007 à 10:58:55

Salut,

mais la variable env contient quoi?
ou c'est la commande env que tu veux utiliser? lami20j

Répondre à lami20j

20

Fred, le 23 aoû 2007 à 11:15:15

Bonjour Lami,
env est une variable qui contient la chaine de caractère MT0707 et je veux extraire un bout de cette chaine (les 4 derniers caractères en fait qui sont mois et année).

env est récupéré depuis un fichier par la commande
env = `cat tutu`
tutu étant un fichier contenant une seule ligneavec MT0707 dedans (je galère complet je dois l'avouer parce que j'imagine que c'est faisable directement, mais bon...).

Bref pour les 4 derniers caractères comme je ne sais pas trop ce que signifie les 2 chiffres après , j'ai préféré mettre 2:2 comme ça je suis sûr que mon problème ne vient pas de là , et donc ici je voudrai récupérer T0 ou peut-être T je sais pas mais je veux récupérer un extrait de la chaine de caractère MT0707

Répondre à Fred