Allez hop, un script!
...
Sauf que comme ça tu bousille ton fichier $1 qui est en même temps source et (surtout) destination.
donc hop un autre script :
!#/bin/sh
mv $1 $1.bak && sed -e "s/$2/$3/g" > $1 < $1.bak
PS: sed = 46K, perl = 700K...
sauf que :
- c'est plutôt : sh + sed (+ cat)? + (tee|mv) , soit 3 ou 4 fork+exec,
- pour traiter plusieurs fichiers tu lances un seul perl...
Quoi qu'il en soit, dans la mesure où tu es couramment déjà dans un shell, que tu travaille avec un fichier de taille raisonnable, sed reste nettement plus rapide...
Sur mon système, comme sur la plupart des systèmes actuels, sed se lance de manière quasi-instantanée, perl se lance de manière quasi-instantanée. Si le programme de substitution doit être exécuté un très grand nombre de fois, de manière automatique, sur un système vieux/chargé, etc, je comprends tes réticences... Mais pour faire des substitutions dans UN (ou quelques) fichier(s), pourquoi utiliser l'abominable sed alors que perl permet de faire bien plus, bien plus simplement?
Dans ce contexte, l'option -i de perl, fonctionnalité que ne propose pas sed, est pratique(tm). Comme tout le reste de perl d'ailleurs. Sauf la gestion des références, qui est lourdingue(tm)
options interessantes:
-e script, --expression=script
add the script to the commands to be executed
-i[suffix], --in-place[=suffix]
edit files in place (makes backup if extension supplied)
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
avec ca on doit pouvoir avoir les memes choses que perl (pas teste)
for in in *; do perl -pi -e 's/windows/linux/g' $i;done
c'est plus propre et en plus dans un script sa te permet de rajouter des truc sympa dans la boucle (incrémenteur pour la progression, etc...)
je suis ni franchement pour perl, ni pour sed, sauf que quand tu veut remplacer des espaces par \espace, j'ai toujours pas trouvé comment faire sa dans un script...
Et si je veux remplacer un caractère par un retour à la ligne je fais comment?
J'ai sed 3.02 et les différents tests que j'ai effectué ne donnent rien :
> sed s/;/\n/g
> sed s/;/\
/g
pareil en doublant-triplant le backslash (le contreoblique pardon) ou en rajoutant des guillemets et cela sous bash, tcsh, zsh (bon j'ai du oublier quelques cominaisons)
en fait la seule façon que j'ai trouvé c'est de passer par un sed -f toto
avec toto contenant le \ suivi d'un retour à la ligne en dur
Et en perl ça marche? (désolé j'en ai marre des tests)
# Perl non, sed oui!
Posté par dcp . Évalué à 1.
sed -e 's/windows/linux/g'
Allez hop, un script!
#!/bin/sh
cat $1 | tee $1.bak | sed -e "s/$2/$3/g" > $1
$ my_subst fic.txt windows linux
PS: sed = 46K, perl = 700K...
[^] # Re: Perl non, sed oui!
Posté par Annah C. Hue (site web personnel) . Évalué à 2.
Mais ce qu'il y a de bien avec UNIX, c'est que TMTOWTDI :-)
[^] # ...sed pourquoi pas, mais pas n'importe comment
Posté par dido . Évalué à 1.
...
Sauf que comme ça tu bousille ton fichier $1 qui est en même temps source et (surtout) destination.
donc hop un autre script :
!#/bin/sh
mv $1 $1.bak && sed -e "s/$2/$3/g" > $1 < $1.bak
PS: sed = 46K, perl = 700K...
sauf que :
- c'est plutôt : sh + sed (+ cat)? + (tee|mv) , soit 3 ou 4 fork+exec,
- pour traiter plusieurs fichiers tu lances un seul perl...
[^] # Re: ...sed pourquoi pas, mais pas n'importe comment
Posté par Jar Jar Binks (site web personnel) . Évalué à 1.
[^] # Re: ...sed pourquoi pas, mais pas n'importe comment
Posté par Anonyme . Évalué à 1.
[^] # Re: ...sed pourquoi pas, mais pas n'importe comment
Posté par spart . Évalué à 1.
$ ls -l test.html
-rw-r--r-- 1 devel devel 851929 fév 9 12:31 test.html
$ time perl -pi -e 's/foo/bar/g' test.html
0.00user 0.03system 0:00.02elapsed 111%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (346major+58minor)pagefaults 0swaps
$ time sed -i -e 's/foo/bar/g' test.html
0.03user 0.04system 0:00.06elapsed 107%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (152major+25minor)pagefaults 0swaps
[^] # Re: ...sed pourquoi pas, mais pas n'importe comment
Posté par Tripnotik . Évalué à 1.
@++
[^] # Re: Perl non, sed oui!
Posté par Gruik Man . Évalué à 1.
Dans ce contexte, l'option -i de perl, fonctionnalité que ne propose pas sed, est pratique(tm). Comme tout le reste de perl d'ailleurs. Sauf la gestion des références, qui est lourdingue(tm)
[^] # Re: Perl non, sed oui!
Posté par -=[ silmaril ]=- (site web personnel) . Évalué à 1.
options interessantes:
-e script, --expression=script
add the script to the commands to be executed
-i[suffix], --in-place[=suffix]
edit files in place (makes backup if extension supplied)
-r, --regexp-extended
use extended regular expressions in the script.
-s, --separate
consider files as separate rather than as a single continuous
long stream.
avec ca on doit pouvoir avoir les memes choses que perl (pas teste)
[^] # Re: Perl non, sed oui!
Posté par xoffox . Évalué à 1.
[^] # Re: Perl non, sed oui!
Posté par Pascal Terjan (site web personnel) . Évalué à 1.
[^] # Re: Perl non, sed oui!
Posté par Raphaël G. (site web personnel) . Évalué à 1.
c'est plus propre et en plus dans un script sa te permet de rajouter des truc sympa dans la boucle (incrémenteur pour la progression, etc...)
je suis ni franchement pour perl, ni pour sed, sauf que quand tu veut remplacer des espaces par \espace, j'ai toujours pas trouvé comment faire sa dans un script...
# Re: Changer
Posté par Alexandre Dulaunoy (site web personnel) . Évalué à 1.
Sed n'est pas très bien documenté mais cela fonctionne mais utilise bcp de mémoire pour les grands fichiers...
[^] # Re: Changer
Posté par calandoa . Évalué à 1.
J'ai sed 3.02 et les différents tests que j'ai effectué ne donnent rien :
> sed s/;/\n/g
> sed s/;/\
/g
pareil en doublant-triplant le backslash (le contreoblique pardon) ou en rajoutant des guillemets et cela sous bash, tcsh, zsh (bon j'ai du oublier quelques cominaisons)
en fait la seule façon que j'ai trouvé c'est de passer par un sed -f toto
avec toto contenant le \ suivi d'un retour à la ligne en dur
Et en perl ça marche? (désolé j'en ai marre des tests)
[^] # Re: Changer
Posté par helf (site web personnel) . Évalué à 1.
[^] # Re: Changer
Posté par calandoa . Évalué à 1.
Le prb c'est que ^M ça fait un retour au début de la même
ligne, pas de la suivante... il suffit de mettre un ^J me direz vous?
Ben sed n'est pas d'accord...:
sed: -e expression #1, char 4: Unterminated `s' command
[^] # Re: Changer
Posté par Cyber Kobold (site web personnel) . Évalué à 1.
par exemple transformer tous les é en e sur tous les fichiers contenus dans un répertoire
on fait comment ?
[^] # Re: Changer
Posté par sam_80 . Évalué à 1.
for i in *é* ; do
i1=$(echo $i|sed -e y/é/e/)
mv "$i" "$i1"
done
je pense que ca devrait marcher
[^] # Re: Changer
Posté par CycyX . Évalué à 1.
rename 's/é/e/g' *
(Et oui, c du perl...)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.