OVH Cloud OVH Cloud

extraction dans un fichier pour alimenter un shell

6 réponses
Avatar
B.Mellé
Bonjour,

Je recheche une solution simple style cut,sed ou nawk au max pour extraire
une donnée variable identifiée par un mot_clé dans un fichier et la
réutiliser dans un shell :
-le fichier source contient un texte non structuré de longueur variable,
quelque part il contient 1 fois la séquence 'Ref:' suivie d'un code à 10
caractéres .
-je souhaite extraire ces 10 caractéres pour les réutiliser dans la
recherche d'un document annexe dont le nom est composé entre autre de ces 10
caractères

début du shell qui fonctionne (il attend 2 variables, $2 est le nom du
fichier source)

VAL=`grep -c "Ref." $2`
cpt=`expr $VAL`
if [ $cpt != 0 ]
then
#mon fichier à traiter contient bien une 'ref'
REF='.... ce que je n'arrive pas à faire... c'est à dire les 10 car qui
suivent Ref.'
if [ ! -f /repértoire/documents/$REF.txt ]
then
#j'imprime le document annnexe puisqu'il existe
lp -d $1 /repértoire/documents/$REF.txt
fi
fi

Je vous remercie de votre aide
Cordialement
B.Mellé

6 réponses

Avatar
Stephane Chazelas
2004-09-10, 15:35(+02), B.Mellé:
Bonjour,

Je recheche une solution simple style cut,sed ou nawk au max pour extraire
une donnée variable identifiée par un mot_clé dans un fichier et la
réutiliser dans un shell :
-le fichier source contient un texte non structuré de longueur variable,
quelque part il contient 1 fois la séquence 'Ref:' suivie d'un code à 10
caractéres .


Pour avoir la premierre occurrence de Ref:code:

REF=`sed '/Ref:([0-9]{10}).*/!d;s//
/;s/.*n//;q' < fichier`

(utiliser /usr/xpg4/bin/sed sur Solaris).

[...]
if [ ! -f /repértoire/documents/$REF.txt ]


Toujours mettre des quotes autour des variables:

if [ ! -f "/repértoire/documents/$REF.txt" ]

then
#j'imprime le document annnexe puisqu'il existe
lp -d $1 /repértoire/documents/$REF.txt


lp -d "$1" "/repértoire/documents/$REF.txt"

--
Stephane

Avatar
Stephane Chazelas
2004-09-10, 13:52(+00), Stephane Chazelas:
2004-09-10, 15:35(+02), B.Mellé:
Bonjour,

Je recheche une solution simple style cut,sed ou nawk au max pour extraire
une donnée variable identifiée par un mot_clé dans un fichier et la
réutiliser dans un shell :
-le fichier source contient un texte non structuré de longueur variable,
quelque part il contient 1 fois la séquence 'Ref:' suivie d'un code à 10
caractéres .


Pour avoir la premierre occurrence de Ref:code:

REF=`sed '/Ref:([0-9]{10}).*/!d;s//
/;s/.*n//;q' < fichier`
[...]


Oups:

REF=`sed '/Ref:([0-9]{10}).*/!d;s//
1/;s/.*n//;q' < fichier`

Si fichier contient:

Ref:0123456789Ref:9876543210

Ca retourne: 0123456789 (attention, ce nombre est invalide pour
l'arithmetique des shells POSIX conformant, car c'est un nombre
octal mal formé).

--
Stephane


Avatar
B.Mellé
Merci de votre rapidité,
J'ai testé votre correction et j'ai un petit problème car il me retourne
toute la ligne et non pas les seuls 10 caractères de la référence, à noter
que le texte recherché est une position variable, c'est à dire qu'il est
précédé et suivi par du texte inutile pour mon usage.

Cordialement
B.Mellé

"Stephane Chazelas" a écrit dans le message de
news:
2004-09-10, 13:52(+00), Stephane Chazelas:
2004-09-10, 15:35(+02), B.Mellé:
Bonjour,

Je recheche une solution simple style cut,sed ou nawk au max pour
extraire



une donnée variable identifiée par un mot_clé dans un fichier et la
réutiliser dans un shell :
-le fichier source contient un texte non structuré de longueur
variable,



quelque part il contient 1 fois la séquence 'Ref:' suivie d'un code à
10



caractéres .


Pour avoir la premierre occurrence de Ref:code:

REF=`sed '/Ref:([0-9]{10}).*/!d;s//
/;s/.*n//;q' < fichier`
[...]


Oups:

REF=`sed '/Ref:([0-9]{10}).*/!d;s//
1/;s/.*n//;q' < fichier`

Si fichier contient:

Ref:0123456789Ref:9876543210

Ca retourne: 0123456789 (attention, ce nombre est invalide pour
l'arithmetique des shells POSIX conformant, car c'est un nombre
octal mal formé).

--
Stephane




Avatar
Stephane Chazelas
2004-09-10, 16:48(+02), B.Mellé:
REF=`sed '/Ref:([0-9]{10}).*/!d;s//
1/;s/.*n//;q' < fichier`
[...]


J'ai testé votre correction et j'ai un petit problème car il me retourne
toute la ligne et non pas les seuls 10 caractères de la référence, à noter
que le texte recherché est une position variable, c'est à dire qu'il est
précédé et suivi par du texte inutile pour mon usage.
[...] [Merci de poster a l'endroit et d'eviter de reprendre tout

l'article auquel tu reponds]

Ah oui, desolé, j'avais testé sans les `...`

REF=`sed '/Ref:([0-9]{10}).*/!d;s//
1/;s/.*n//;q' < fichier`

Ou

REF=$(sed '/Ref:([0-9]{10}).*/!d;s//
1/;s/.*n//;q' < fichier)


--
Stephane


Avatar
bmelle
Excusez-moi pour la reprise du message.
Par contre je ne comprends pas la formule 'poster à l'endroit'

Sinon grand merci car ça marche, en fait je pensais que le retour chariot
inclus dans la formule était un effet du viewer.

Néophyte sous Unix, je reste étonné par la puissance de telles lignes de
commandes,et comme j'aime bien comprendre, connaissez-vous un ouvrage
'français' explicitant en détail et avec exemples le fonctionnement d'outils
tels que sed.

Cordialement
B.Mellé
Avatar
Rakotomandimby Mihamina
bmelle wrote:
Par contre je ne comprends pas la formule 'poster à l'endroit'


=> repondre _en-dessous_ de ce a quoi on répond :
http://www.giromini.org/usenet-fr/repondre.html
--
ASPO Infogérance - http://aspo.rktmb.org/activites/infogerance
Unofficial FAQ fcolc - http://faq.fcolc.eu.org/
Linux User Group sur Orléans et alentours.
Tél: + 33 2 38 76 43 65 (France)