[csh] trouver et remplacer

trouver et remplacer [csh] - C - Programmation

Marsh Posté le 29-09-2006 à 12:06:56    

bonjour,
 
je voudrais trouver dans tous mes sous dossier les fichiers qui contiennent la chaine "4*atan(1)" et les remplacer par la chaine "(4*atan(1))" ...est ce que c'est possible de faire ca en shell script ??? J'ai essayé avec sed mais les parenthèse posent pb apparement  :o  
 
merci par avance  :love:  :love:  :love:  
 

Reply

Marsh Posté le 29-09-2006 à 12:06:56   

Reply

Marsh Posté le 29-09-2006 à 15:23:07    

in_your_phion a écrit :

bonjour,
 
je voudrais trouver dans tous mes sous dossier les fichiers qui contiennent la chaine "4*atan(1)" et les remplacer par la chaine "(4*atan(1))" ...est ce que c'est possible de faire ca en shell script ??? J'ai essayé avec sed mais les parenthèse posent pb apparement  :o  
 
merci par avance  :love:  :love:  :love:


 
Déjà ce n'est pas du C mais du shell (même du C-shell reste du shell) - T'as une rubrique pour ça.
Ensuite, si tu nous montrais ce que t'as fait en script on pourrait mieux comprendre. Par exemple si t'as mis des guillemets simples ou doubles, la gestion des caractères spéciaux n'est pas la même.
 
Essaye ça (jle fais de tête)

Citation :

#!/bin/sh
cd repertoire_ou_il_faut_remplacer_les_fichiers
ls |while read file
do
    test ! -f "$file" && continue
    sed -e "s/4 * atan(1)/(4 * atan (1))/g" "$file" >tmp
    mv tmp "$file"
done


 
Si ça marche pas, protège les parenthèses par des backslashes

Citation :

sed -e "s/4 * atan\(1\)/\(4 * atan \(1\)\)/g" "$file" >tmp


Message édité par Sve@r le 29-09-2006 à 16:12:43

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

Marsh Posté le 01-10-2006 à 13:34:33    

Salut,
 
C'est bien sed qu'il faut que tu utilises.
$ echo 'foobar4*atan(1)bar4*atan(1)baz' > test-sed
$ sed -s 's/4*atan(1)/(4*atan(1))/g' < test-sed  
foobar4*(4*atan(1))bar4*(4*atan(1))baz
$

Reply

Marsh Posté le 01-10-2006 à 13:36:28    

Ah, et puis pour la récursion ça donnerait quelque chose comme :
$ for i in `find .`; do sed -s 's/4*atan(1)/(4*atan(1))/g' < "$i" > tmp; mv tmp "$i";done
 
Cela dit je n'ai pas testé, donc attention. ;-)

Reply

Marsh Posté le 01-10-2006 à 13:39:29    

Mince je raconte n'importe quoi, for n'existe pas en csh... :-/
Tu n'as pas accès à un vrai (Bourne) shell (bash, zsh) ?

Reply

Marsh Posté le 01-10-2006 à 16:53:02    

Zavie a écrit :

Ah, et puis pour la récursion ça donnerait quelque chose comme :
$ for i in `find .`; do sed -s 's/4*atan(1)/(4*atan(1))/g' < "$i" > tmp; mv tmp "$i";done


Attention à la syntaxe "for var in `commande`" car si "commande" renvoie une info avec un espace, le "for" découpera l'info en 2 itérations. Chaque itération n'ayant qu'une partie de l'info ne fonctionnera pas et l'info ne sera pas traitée...
Mieux vaut préférer la syntaxe "commande |while read var" car le read arrête sa lecture au "return"
 

Zavie a écrit :

Mince je raconte n'importe quoi, for n'existe pas en csh... :-/


Boaf il y a probablement son équivalent
 

Zavie a écrit :

Tu n'as pas accès à un vrai (Bourne) shell (bash, zsh) ?


[:rofl]


Message édité par Sve@r le 01-10-2006 à 16:55:06

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

Marsh Posté le 01-10-2006 à 21:17:33    

Ah merci pour l'astuce. C'est vrai que cette histoire d'espace est souvent assez gênante...


---------------
Viendez vous battre à Prologin \o/
Reply

Marsh Posté le 04-10-2006 à 15:40:51    

Zavie a écrit :

Mince je raconte n'importe quoi, for n'existe pas en csh... :-/
Tu n'as pas accès à un vrai (Bourne) shell (bash, zsh) ?


 
coucou,
 
si :) en fait je pensais que csh était bien  :sweat:  ?

Reply

Marsh Posté le 09-10-2006 à 17:45:20    

C'est "un peu" vieux (il y a eu tcsh depuis), et surtout, le standard c'est quand même d'être compatible Bourne.


---------------
Viendez vous battre à Prologin \o/
Reply

Marsh Posté le 09-10-2006 à 18:19:02    

Zavie a écrit :

le standard c'est quand même d'être compatible Bourne.


Ya rien qui oblige car chaque script s'exécute dans l'environnement qui lui est défini par sa première ligne  

#! <chemin_vers interpréteur>


 
Donc même si tu bosses en bash, tu pourras parfaitement exécuter un script csh (pour peu qu'il possède cette fameuse ligne)...


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

Marsh Posté le 09-10-2006 à 18:19:02   

Reply

Marsh Posté le 10-10-2006 à 11:57:36    

Citation :

Ya rien qui oblige car chaque script s'exécute dans l'environnement qui lui est défini par sa première ligne  

#! <chemin_vers interpréteur>


 
Donc même si tu bosses en bash, tu pourras parfaitement exécuter un script csh (pour peu qu'il possède cette fameuse ligne)...

Je ne dis pas le contraire, seulement le standard c'est le shell Bourne (sh dans un script, bash ou zsh dans un terminal histoire d'avoir un minimum de confort). Quand je lance un grep dans /etc/init.d sur une Debian classique, j'ai une énorme majorité de /bin/sh, quelques /bin/bash, et aucun csh.
 
Autant utiliser les outils standards, et surtout, pourquoi se galérer avec un shell antédiluvien pour réaliser une opération de tous les jours sur son arborescence ?


---------------
Viendez vous battre à Prologin \o/
Reply

Sujets relatifs:

Leave a Replay

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