Script et SED
Résolu/Fermé
pcsystemd
-
3 mai 2008 à 21:18
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 6 mai 2008 à 23:17
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 6 mai 2008 à 23:17
A voir également:
- Script et SED
- Script vidéo youtube - Guide
- Ghost script - Télécharger - Polices de caractères
- Script bat - Guide
- Microsoft activation script - Accueil - Windows
- Executeur de script - Télécharger - Édition & Programmation
9 réponses
touchepasaugrisbi
Messages postés
75
Date d'inscription
vendredi 25 avril 2008
Statut
Membre
Dernière intervention
15 juin 2008
4
4 mai 2008 à 00:20
4 mai 2008 à 00:20
Bonsoir,
Désolé, pas d'idée...
Mais une suggestion ! Es-tu allé voir là ?
http://www.commentcamarche.net/faq/sujet 9536 sed introduction a sed part i
http://www.commentcamarche.net/faq/sujet 9559 sed introduction a sed part ii
http://www.commentcamarche.net/faq/sujet 9558 sed introduction a sed part iii
Bon courage.
Désolé, pas d'idée...
Mais une suggestion ! Es-tu allé voir là ?
http://www.commentcamarche.net/faq/sujet 9536 sed introduction a sed part i
http://www.commentcamarche.net/faq/sujet 9559 sed introduction a sed part ii
http://www.commentcamarche.net/faq/sujet 9558 sed introduction a sed part iii
Bon courage.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
4 mai 2008 à 11:01
4 mai 2008 à 11:01
Salut,
Pour récupérer que les chiffres de ton fichier avec "sed" :
Pour récupérer que les chiffres de ton fichier avec "sed" :
sed 's/[^[:digit:]]//g' fichierUniquement la ligne des votes simples :
sed -n '/simple/ s/[^[:digit:]]//gp' fichierDes votes doubles :
sed -n '/double/ s/[^[:digit:]]//gp' fichierSinon pour récupérer que les chiffres, tu peux faire aussi avec "grep" :
grep -o '[0-9][0-9]*' fichier;-))
Merci beaucoup pour vos infos. Mon souci était surtout comment insérer dans le fichier qui cointient deja les résultats du mois, les chiffres du mois antécédent:
nombre de vote simple : 125455
nombre de vote double : 25645
je copie le fichier du mois que je rennome en old pour pouvoir recuperer les chiffres le mois prochain
cp -f fichier fichier.old
Je traite le fichier avec SED pour ne récuperer que les chiffres du mois dernier
cat fichier.old | sed 's/[^[:digit:]]//g' > fichier avec les chiffres uniquement
135648
25645
mais c'est aprés comment insérer cela a la suite du style :
nombre de vote simple : 125455 (contre 24968 en Avril)
nombre de vote double : 25645 (contre 24968 en Avril)
Merci
nombre de vote simple : 125455
nombre de vote double : 25645
je copie le fichier du mois que je rennome en old pour pouvoir recuperer les chiffres le mois prochain
cp -f fichier fichier.old
Je traite le fichier avec SED pour ne récuperer que les chiffres du mois dernier
cat fichier.old | sed 's/[^[:digit:]]//g' > fichier avec les chiffres uniquement
135648
25645
mais c'est aprés comment insérer cela a la suite du style :
nombre de vote simple : 125455 (contre 24968 en Avril)
nombre de vote double : 25645 (contre 24968 en Avril)
Merci
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
4 mai 2008 à 14:11
4 mai 2008 à 14:11
$ cat resultat_du_mois.txt nombre de vote simple : 125455 nombre de vote double : 25645 $ cat fichier_old.txt 115644 24968 $ simple=$(sed -n '1p' fichier_old.txt) $ echo $simple 115644 $ double=$(sed -n '2p' fichier_old.txt) $ echo $double 24968 $ sed "1 {s/.*/& (contre $simple en Avril)/};2 {s/.*/& (contre $double en Avril)/}" resultat_du_mois.txt nombre de vote simple : 125455 (contre 115644 en Avril) nombre de vote double : 25645 (contre 24968 en Avril) $Ceci n'est qu'un exemple. Pour faire plus simple, tu peux récupérer directement les valeurs "simple" et "double" directement dans le fichier original, sans passer par un fichier "old"...
Le résultat est ici affiché sur l'écran, tu peux soit le rediriger dans un fichier "> nouveau_fichier" ou faire en sorte que le changement soit effectif sur le fichier lu en entrée en rajoutant l'option "-i.bak" à la commande "sed" (le .bak" est facultatif, ça crée juste une copie de sauvegarde du fichier original).
;-))
Grace a tes infos voila une partie de mon script shell mais j'ai une erreur de synthaxe SED :
fi
if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]
then
CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
echo 'nombre de votes simples et doubles au '${DATE} >> ${TMPDIR}/stat_${DATE}.lst
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre $CONFI en $DATEOLD)/};2 {s/.*/& (contre $SIMPL en $DATEOLD)/}' >> ${TMPDIR}/stat_${DATE}.lst
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/[^[:digit:]]//g' > ${TMPDIR}/nb_votes_old.lst
else
echo 'error' | mail -s "statistiques votes: nombre de votes simples et doubles le ${DATE}" toto@toto.fr
fi
je lance mon script et voila l'erreur que j'ai :
sed: -e expression #1, char 46: Unknown option to 's'
As tu une idée?
Merci encore
fi
if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]
then
CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
echo 'nombre de votes simples et doubles au '${DATE} >> ${TMPDIR}/stat_${DATE}.lst
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre $CONFI en $DATEOLD)/};2 {s/.*/& (contre $SIMPL en $DATEOLD)/}' >> ${TMPDIR}/stat_${DATE}.lst
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/[^[:digit:]]//g' > ${TMPDIR}/nb_votes_old.lst
else
echo 'error' | mail -s "statistiques votes: nombre de votes simples et doubles le ${DATE}" toto@toto.fr
fi
je lance mon script et voila l'erreur que j'ai :
sed: -e expression #1, char 46: Unknown option to 's'
As tu une idée?
Merci encore
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
pcsystemd
4 mai 2008 à 18:25
4 mai 2008 à 18:25
Il te faut entourer l'expression avec des quotes doubles et non des quotes simples pour que les variables soient interprétées, comme dans mon exemple et ça devrait rouler...
Voir SED - Le remplacement de variables
Voir SED - Le remplacement de variables
pcsystemd
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 mai 2008 à 18:49
4 mai 2008 à 18:49
Désolé mais j'ai essayé ce que tu m'indiques mais cela ne fonctionne toujours pas j'ai la meme erreur mais avec un numéro different du style :
sed: -e expression #1, char 50: Unknown option to 's'
J'avais déjà lu ton excellent tuto sur SED mais j'ai de nouveau jeter un coup d'oeil et j'ai tout essayé avec double cotes, simple cote expression avec simples cotes et variable entre doubles cotes et l'inverse mais toujours meme erreur il n'y a que le numero de char qui change.
Merci encore pour le temps que tu m'accorde
sed: -e expression #1, char 50: Unknown option to 's'
J'avais déjà lu ton excellent tuto sur SED mais j'ai de nouveau jeter un coup d'oeil et j'ai tout essayé avec double cotes, simple cote expression avec simples cotes et variable entre doubles cotes et l'inverse mais toujours meme erreur il n'y a que le numero de char qui change.
Merci encore pour le temps que tu m'accorde
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
pcsystemd
4 mai 2008 à 18:54
4 mai 2008 à 18:54
Que contiennent les variables ? Il y a des chemins dedans (slash) ?
Affiche un echo de tes 2 variables s'il te plaît.
Affiche un echo de tes 2 variables s'il te plaît.
pcsystemd
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
5 mai 2008 à 06:50
5 mai 2008 à 06:50
Je remet le bout de script :
if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]
then
CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
echo 'nombre de votes simples et doubles au '${DATE} >> ${TMPDIR}/stat_${DATE}.lst
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre $CONFI en $DATEOLD)/};2 {s/.*/& (contre $SIMPL en $DATEOLD)/}' >> ${TMPDIR}/stat_${DATE}.lst
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/[^[:digit:]]//g' > ${TMPDIR}/nb_votes_old.lst
else
echo 'error' | mail -s "statistiques votes: nombre de votes simples et doubles le ${DATE}" toto@toto.fr
fi
puis voici ce que contienne les variables présentes :
$ TMPDIR="/tmp/`whoami`"
$ echo $TMPDIR
/tmp/toto
$ DATE=`date '+%d-%m-%Y'`
$ echo $DATE
05-05-2008
DATESOLD=`date -d '-1 month' '+%B'`
CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
Merci
if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]
then
CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
echo 'nombre de votes simples et doubles au '${DATE} >> ${TMPDIR}/stat_${DATE}.lst
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre $CONFI en $DATEOLD)/};2 {s/.*/& (contre $SIMPL en $DATEOLD)/}' >> ${TMPDIR}/stat_${DATE}.lst
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/[^[:digit:]]//g' > ${TMPDIR}/nb_votes_old.lst
else
echo 'error' | mail -s "statistiques votes: nombre de votes simples et doubles le ${DATE}" toto@toto.fr
fi
puis voici ce que contienne les variables présentes :
$ TMPDIR="/tmp/`whoami`"
$ echo $TMPDIR
/tmp/toto
$ DATE=`date '+%d-%m-%Y'`
$ echo $DATE
05-05-2008
DATESOLD=`date -d '-1 month' '+%B'`
CONFI="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
Merci
Franchement merci beaucoup jippicy car je me creuse la tête depuis plusieurs jours mais bon je débute et ta réponse est clair et précise franchement c'est rare d'avoir une aide comme cela sur le net .
Merci beaucoup je tente cela et je te dirais ce qu'il en est.
Merci beaucoup je tente cela et je te dirais ce qu'il en est.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
5 mai 2008 à 08:39
5 mai 2008 à 08:39
Bon je crois avoir décelé d'où vient l'erreur. Essaie avec cette syntaxe :
sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en '"${DATEOLD}"')/};2 {s/.*/& (contre '"${SIMPL}"' en '"${DATEOLD}"')/}'PS. Quand je te demandais ce que contenaient les variables, c'était plutôt des variables "$SIMPL" et "$DATEOLD" que je parlais ;-))
Je suis désolé mais cela ne fonctionne pas et j'ai beau chercher d'ou vient le souci je ne trouve pas c'est désesperent
sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en '"${DATEOLD}"')/};2 {s/.*/& (contre '"${SIMPL}"' en '"${DATEOLD}"')/}'
j'ai une errreur :
sed: -e expression #1, char 37: Unknown option to 's'
Merci encore
sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en '"${DATEOLD}"')/};2 {s/.*/& (contre '"${SIMPL}"' en '"${DATEOLD}"')/}'
j'ai une errreur :
sed: -e expression #1, char 37: Unknown option to 's'
Merci encore
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
5 mai 2008 à 17:22
5 mai 2008 à 17:22
Peux-tu afficher le contenu du fichier "nb_votes_old.lst" ainsi que le contenu des variables "$CONFI", "$SIMPL" et "$DATEOLD" ?
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
5 mai 2008 à 18:39
5 mai 2008 à 18:39
Si tu définis tes variables une à une depuis un shell, puis que tu exécutes chaque commande toujours depuis un shell, est-ce que ça marche ?
Essaie d'exécuter ton script en mode verbeux, rajoute "set -xv" après la ligne "shebang".
Fais-en de même pour les commandes depuis le shell si elles foirent, lances d'abord la commande "set -xv" et exécute tes commandes ("set -" pour revenir à la normale).
Essaie d'exécuter ton script en mode verbeux, rajoute "set -xv" après la ligne "shebang".
Fais-en de même pour les commandes depuis le shell si elles foirent, lances d'abord la commande "set -xv" et exécute tes commandes ("set -" pour revenir à la normale).
pas de problème si je defini mes variables une a une depuis un shel et que je les execute en mode DEBUG
$ CONFI="$(sed -n '1p' /${TMPDIR}/nb_votes_old.lst)"
sed -n '1p' /${TMPDIR}/nb_votes_old.lst
++ sed -n 1p //tmp//nb_cotes_old.lst
+ CONFI=14594
sauf comme d'hab ci-dessous
$ cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' )/};2 {s/.*/& (contre '"${SIMPL}"' en )/}' >> ${TMPDIR}/stat_${DATE}.lst
+ cat /tmp/nb_votes_.lst
+ sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en )/};2 {s/.*/& (contre '"${SIMPL}"' en )/}'
sed: -e expression #1, char 27: Unknown option to 's'
Merci
$ CONFI="$(sed -n '1p' /${TMPDIR}/nb_votes_old.lst)"
sed -n '1p' /${TMPDIR}/nb_votes_old.lst
++ sed -n 1p //tmp//nb_cotes_old.lst
+ CONFI=14594
sauf comme d'hab ci-dessous
$ cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' )/};2 {s/.*/& (contre '"${SIMPL}"' en )/}' >> ${TMPDIR}/stat_${DATE}.lst
+ cat /tmp/nb_votes_.lst
+ sed -e 's/|//g;1 {s/.*/& (contre '"${CONFI}"' en )/};2 {s/.*/& (contre '"${SIMPL}"' en )/}'
sed: -e expression #1, char 27: Unknown option to 's'
Merci
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
5 mai 2008 à 19:58
5 mai 2008 à 19:58
Là je ne vois pas du tout d'où est-ce que ça pourrait venir ;-\
Essaie d'interpréter les variables à la place du shell et de taper la commande sed...
Que contient le ficher "nb_votes_${DATE}.lst" ? Et pourquoi cette première commande dans ton sed "s/|//g" ???
Essaie d'interpréter les variables à la place du shell et de taper la commande sed...
Que contient le ficher "nb_votes_${DATE}.lst" ? Et pourquoi cette première commande dans ton sed "s/|//g" ???
le ficher "nb_votes_${DATE}.lst" contient :
nombre de vote simple : |125455
nombre de vote double : |25645
c'est le fichier que je traite avec sed "s/|//g" pour retirer le |
Merci pour toute ton aide vraiment car j'ai trouvé cela tres enrichissant et surtout c'est rare de trouver une aide aussi constructive sur le net.
nombre de vote simple : |125455
nombre de vote double : |25645
c'est le fichier que je traite avec sed "s/|//g" pour retirer le |
Merci pour toute ton aide vraiment car j'ai trouvé cela tres enrichissant et surtout c'est rare de trouver une aide aussi constructive sur le net.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
pcsystemd
6 mai 2008 à 09:53
6 mai 2008 à 09:53
Bon j'ai refait les tests chez moi avec toutes les données et ça passe très bien ;-\
Je ne vois vraiment pas ce qui cloche ! ;-\
Quelle version de "sed" ? Quel environnement ? Quel shell ?
Dans les variables interprétées, il n'y a aucun slash ou caractère susceptible d'être mal interprété par sed ou par le shell ?
Si tu peux, définis toutes tes variables et affiches-les :
Je ne vois vraiment pas ce qui cloche ! ;-\
Quelle version de "sed" ? Quel environnement ? Quel shell ?
Dans les variables interprétées, il n'y a aucun slash ou caractère susceptible d'être mal interprété par sed ou par le shell ?
Si tu peux, définis toutes tes variables et affiches-les :
variable1="..." echo $variable1 variable2="..." echo $variable2 etc.;-))
pcsystemd
>
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
6 mai 2008 à 12:23
6 mai 2008 à 12:23
Bon voila enfin c'est résolu cela venait de la version de SED en version 3.2 cela ne fonctionne pas mais en 4 oui sachant que la machine ou s'execute le script est une machine en prod et a comme version de SED la 3.2. Par contre je serais curieux de savoir ce qui n'est plus compatible avec la version 3.2 dans mon script .
Merci mille fois vraiment
Merci mille fois vraiment
je viens de voir son meme message sur un autre forum il utilises un tres vieux gnu sed genre version 3
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
6 mai 2008 à 16:17
6 mai 2008 à 16:17
Oups, j'avions pas vu ;-[
Merci ;-)
Merci ;-)
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
>
pcsystemd
6 mai 2008 à 23:17
6 mai 2008 à 23:17