[SCRIPT UNIX]Pb avec sed

Pb avec sed [SCRIPT UNIX] - Shell/Batch - Programmation

Marsh Posté le 20-10-2006 à 09:58:19    

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.

Reply

Marsh Posté le 20-10-2006 à 09:58:19   

Reply

Marsh Posté le 20-10-2006 à 10:13:42    

essaie avec eval

Reply

Marsh Posté le 20-10-2006 à 10:26:05    

Ca marche merci.

Reply

Marsh Posté le 26-10-2006 à 19:17:43    

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.
Reply

Marsh Posté le 27-10-2006 à 13:42:30    

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.
Reply

Marsh Posté le 28-10-2006 à 19:10:20    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed