Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1775 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [SCRIPT UNIX]Pb avec sed

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SCRIPT UNIX]Pb avec sed

n°1461125
sylvainlel​eu
Posté le 20-10-2006 à 09:58:19  profilanswer
 

Voici le script en question :

Code :
  1. for FICHIER in `ls $REP_SOURCE`
  2. do
  3.         R=$RANDOM
  4.         while [ $R -le 0 -o R -ge 8000 ]
  5.         do
  6.                 R=$RANDOM
  7.         done
  8.         COUNT=1
  9.         while [ $COUNT -le $NB_RECOPIES ];
  10.         do
  11.                 cp $REP_SOURCE/$FICHIER $REP_TMP/$COUNT
  12.                 TEST="'s/$CHAINE_A_REMPLACER/IMP-$R/g' $REP_TMP/$COUNT > $REP_TMP/$COUNT.dat "
  13.                 sed -e $TEST
  14.                 echo $CHAINE_A_REMPLACER
  15.                 COUNT=`expr $COUNT + 1`
  16.         done
  17. done


et ce qu'il donne :

Code :
  1. + [ 1 -le 3 ]
  2. + cp /webapp/hff/source_jetform/toto /opt/adobe/central/server/tmp/1
  3. + TEST='s/VANCOUV_LAS_UNFR_080/IMP-1657/g' /opt/adobe/central/server/tmp/1 > /opt/adobe/central/server/tmp/1.dat
  4. + sed -e 's/VANCOUV_LAS_UNFR_080/IMP-1657/g' /opt/adobe/central/server/tmp/1 > /opt/adobe/central/server/tmp/1.dat
  5. sed: 's/VANCOUV_LAS_UNFR_080/IMP-1657/g' is not a recognized function.
  6. + echo VANCOUV_LAS_UNFR_080
  7. VANCOUV_LAS_UNFR_080
  8. + + expr 1 + 1
  9. COUNT=2
  10. + [ 2 -le 3 ]
  11. + cp /webapp/hff/source_jetform/toto /opt/adobe/central/server/tmp/2
  12. + TEST='s/VANCOUV_LAS_UNFR_080/IMP-1657/g' /opt/adobe/central/server/tmp/2 > /opt/adobe/central/server/tmp/2.dat
  13. + sed -e 's/VANCOUV_LAS_UNFR_080/IMP-1657/g' /opt/adobe/central/server/tmp/2 > /opt/adobe/central/server/tmp/2.dat
  14. sed: 's/VANCOUV_LAS_UNFR_080/IMP-1657/g' is not a recognized function.
  15. + echo VANCOUV_LAS_UNFR_080
  16. VANCOUV_LAS_UNFR_080
  17. + + expr 2 + 1
  18. COUNT=3
  19. + [ 3 -le 3 ]
  20. + cp /webapp/hff/source_jetform/toto /opt/adobe/central/server/tmp/3
  21. + TEST='s/VANCOUV_LAS_UNFR_080/IMP-1657/g' /opt/adobe/central/server/tmp/3 > /opt/adobe/central/server/tmp/3.dat
  22. + sed -e 's/VANCOUV_LAS_UNFR_080/IMP-1657/g' /opt/adobe/central/server/tmp/3 > /opt/adobe/central/server/tmp/3.dat
  23. sed: 's/VANCOUV_LAS_UNFR_080/IMP-1657/g' is not a recognized function.
  24. + echo VANCOUV_LAS_UNFR_080
  25. VANCOUV_LAS_UNFR_080
  26. + + expr 3 + 1
  27. COUNT=4


Je ne vois pas pourqui sed me fait une erreur alors que si je tape  
sed -e 's/VANCOUV_LAS_UNFR_080/IMP-1657/g' /opt/adobe/central/server/tmp/3 > /opt/adobe/central/server/tmp/3.dat  
en ligne de commande cela passe sans pb.
Merci de votre aide.

mood
Publicité
Posté le 20-10-2006 à 09:58:19  profilanswer
 

n°1461133
Elmoricq
Modérateur
Posté le 20-10-2006 à 10:13:42  profilanswer
 

essaie avec eval

n°1461142
sylvainlel​eu
Posté le 20-10-2006 à 10:26:05  profilanswer
 

Ca marche merci.

n°1465680
Sve@r
Posté le 26-10-2006 à 19:17:43  profilanswer
 

sylvainleleu a écrit :

Voici le script en question :

for FICHIER in `ls $REP_SOURCE`
do
...
done



 
Cette structure pose un gros problème car le "for" utilise l'espace comme séparateur. Et dans le cas où un des fichiers possède un espace dans son nom, le "for" fera alors 2 itérations en découpant le nom sur la 1ère partie puis la 2° partie mais aucune itération ne traitera le fichier lui-même. Au final, il restera non traité
 
Solution permettant d'éviter cela: utiliser le "read" qui se base sur le "return" pour découper ses infos.

ls $REP_SOURCE |while read FICHIER  
do
...
done


Inconvénient: comme le pipe génère un sous-processus, si on implémente une variable (style un compteur) dans le "do", elle est perdue en fin de "done" car le processus disparaît et ses variables avec...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1466065
aigles
Posté le 27-10-2006 à 13:42:30  profilanswer
 

Sve@r a écrit :

Solution permettant d'éviter cela: utiliser le "read" qui se base sur le "return" pour découper ses infos

ls $REP_SOURCE |while read FICHIER  
do  
...  
done


Ceci ne résout pas tous les problèmes car read supprime tous les espaces en début et en fin de ligne.
Une solution est de forcer le séparateur de champ IFS au moment de la lecture (fonctionne trés bien en KSH, à vérifier en SH et BASH) :

ls $REP_SOURCE |while IFS= read FICHIER  
do  
...  
done


 

Sve@r a écrit :

Inconvénient: comme le pipe génère un sous-processus, si on implémente une variable (style un compteur) dans le "do", elle est perdue en fin de "done" car le processus disparaît et ses variables avec...


 
Ce problème est résolu par KSH, et je pense qu'il en est de même avec BASH.


---------------
Jean Pierre.
n°1466669
Sve@r
Posté le 28-10-2006 à 19:10:20  profilanswer
 

aigles a écrit :

Ceci ne résout pas tous les problèmes car read supprime tous les espaces en début et en fin de ligne


Et en quoi est-ce un problème dans ce cas précis ? Peut-on avoir des fichiers dont le nom contient un espace en début ou fin ???
 

aigles a écrit :

Ce problème est résolu par KSH, et je pense qu'il en est de même avec BASH.


Absolument pas. Il est vrai qu'en ksh une variable déclarée dans le do... done est automatiquement remontée au-dessus du pipe mais ce comportement n'a pas été répliqué dans le sh ou bash  Peut-être zsh...
 


Message édité par Sve@r le 28-10-2006 à 19:13:54

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  [SCRIPT UNIX]Pb avec sed

 

Sujets relatifs
script multi upload multi site[oracle] script affichant base connecté
Script de connexion WSH[Résolu][Script aculo us] Sortable.create
[Shell / C] Script shell en tant que démon ?Code retour Java sous Unix
Besoin d'explications sur un script CGI/Perlscript
Changer image de banniére, avec script ou non?[script shell] grep -f sur de grandes quanités de données
Plus de sujets relatifs à : [SCRIPT UNIX]Pb avec sed


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR