Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en trouve
aucun (francophone, du moins) qui soit consacré à la programmation en bash
?
Je souhaite réaliser une même modification sur le contenu d'un assez grand
nombre de fichiers. Il s'agit de remplacer width="512" par width="554".
D'où l'idée d'écrire un petit script, plutôt que de réaliser l'opération à
la main...
Je rencontre cependant un problème auquel je ne trouve pas de solution : les
fichiers produits en sortie perdent toute indentation...!? Vous trouverez
ci-dessous mon script...
rm *.php.tmp -f
ls *.php | while read fichierPHP; do
cat $fichierPHP | while read ligneFichier; do
ligneModifiee="${ligneFichier//width=\"512\"/width=\"554\"}"
echo "$ligneModifiee" >> "$fichierPHP".tmp
done
done
Notez que pour l'instant, par précaution, je crée un fichier "temporaire" de
même nom que le fichier source (plus l'extension ".tmp")
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Thomas Nemeth
Le ven 26 déc 2003 à 14:29, Marc a tapoté : | Bonjour,
Bonjour.
| Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en trouve | aucun (francophone, du moins) qui soit consacré à la programmation en bash | ?
Horreur. Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup plus portable.
| rm *.php.tmp -f | ls *.php | while read fichierPHP; do | cat $fichierPHP | while read ligneFichier; do | ligneModifiee="${ligneFichier//width="512"/width="554"}" | echo "$ligneModifiee" >> "$fichierPHP".tmp | done | done
rm -f *.php.tmp for fichierPHP in *.php; do sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp # Et, si tu veux : mv -f $fichierPHP.tmp $fichierPHP done
| Toute aide bienvenue ! D'avance, MERCI !!!
Avec plaisir.
Thomas --
De toutes facons emacs c'est une surcouche du système d'exploitation, donc normalement il devrait rebooter autant que l'ordinateur. moi, emacs, je l'ai bouté ... hors de ma linuxette
-+- MS in Guide du Fmblien Assassin : "On m'appelle Jeanne d'Arc." -+-
Le ven 26 déc 2003 à 14:29, Marc a tapoté :
| Bonjour,
Bonjour.
| Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en trouve
| aucun (francophone, du moins) qui soit consacré à la programmation en bash
| ?
Horreur.
Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup
plus portable.
| rm *.php.tmp -f
| ls *.php | while read fichierPHP; do
| cat $fichierPHP | while read ligneFichier; do
| ligneModifiee="${ligneFichier//width="512"/width="554"}"
| echo "$ligneModifiee" >> "$fichierPHP".tmp
| done
| done
rm -f *.php.tmp
for fichierPHP in *.php; do
sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp
# Et, si tu veux :
mv -f $fichierPHP.tmp $fichierPHP
done
| Toute aide bienvenue ! D'avance, MERCI !!!
Avec plaisir.
Thomas
--
De toutes facons emacs c'est une surcouche du système d'exploitation,
donc normalement il devrait rebooter autant que l'ordinateur.
moi, emacs, je l'ai bouté ... hors de ma linuxette
-+- MS in Guide du Fmblien Assassin : "On m'appelle Jeanne d'Arc." -+-
Le ven 26 déc 2003 à 14:29, Marc a tapoté : | Bonjour,
Bonjour.
| Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en trouve | aucun (francophone, du moins) qui soit consacré à la programmation en bash | ?
Horreur. Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup plus portable.
| rm *.php.tmp -f | ls *.php | while read fichierPHP; do | cat $fichierPHP | while read ligneFichier; do | ligneModifiee="${ligneFichier//width="512"/width="554"}" | echo "$ligneModifiee" >> "$fichierPHP".tmp | done | done
rm -f *.php.tmp for fichierPHP in *.php; do sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp # Et, si tu veux : mv -f $fichierPHP.tmp $fichierPHP done
| Toute aide bienvenue ! D'avance, MERCI !!!
Avec plaisir.
Thomas --
De toutes facons emacs c'est une surcouche du système d'exploitation, donc normalement il devrait rebooter autant que l'ordinateur. moi, emacs, je l'ai bouté ... hors de ma linuxette
-+- MS in Guide du Fmblien Assassin : "On m'appelle Jeanne d'Arc." -+-
Thomas Nemeth
Le ven 26 déc 2003 à 15:40, Marc a tapoté : | Re-bonjour ;-)
Re :)
| Avant tout, Merci pour cette réponse rapide !
:)
| > Horreur. | > Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup | > plus portable. | | Portable ? Pourquoi ? Un "/bin/sh" revient uniquement à préciser le shell | que l'on veut utiliser pour l'exécution d'un script, non ? En fait, la
Oui.
| portablilité du "code", je ne vois pas trop, car les shells semblent avoir | pas mal de différences, y compris pour des choses "basiques" comme un test | d'égalité ! Il semble que ce soit :
Justement. L'utilisation de /bin/sh est (presque) la même sur tous les OS POSIX. Alors que les shells sont totalement différents et certains ne sont même pas installés : bash n'est pas le shell par défaut de tous les OS, de même pour csh, tcsh, ksh, etc. Chacun d'eux est le shell par défaut d'un OS et pas sur les autres. C'est pourquoi utiliser /bin/sh permet d'utiliser le même script partout (ou presque : il y a toujours quelques cas gênants :).
| Sinon, sur mon Linux (Mandrake 9.1), /bin/sh est un lien vers bash !
Oui, comme bien souvent actuellement. Cependant bash, lorsqu'il est appelé en tant que /bin/sh a un comportement (plus ou moins) fidèle aux règles POSIX.
| Et un "tcsh monScript" ne fonctionne pas: problème de syntaxe avec while.
Et oui : tcsh n'est pas /bin/sh.
| Bref, la portablitié ? J'ai raté qqch ?
Tout :)
| > sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp | | Il semble que l'option -e ne soit utile que s'il y a plusieurs commandes | d'édition ! Auquel cas il faut faire sed -e 'xxx' -e 'yyy' ...
Non. Tu peux utiliser l'option -e avec une seule commande. Ça fait des années que je l'utilise ainsi. Tu peux même l'utiliser avec plusieurs commandes sans la spécifier plusieurs fois : sed -e 'commande1;commande2;commande3'
| Sinon, je suppose que mon script initial perdait l'indentation parce que | 'read' ignore en début de ligne tout ce qui est 'espace', tabulations, | etc...?
D'une part. Et d'autre part 2 boucles plus une réécriture ligne par ligne du fichier, à la main, c'est vraiment pas du tout efficace alors qu'il y a des outils pour ça nettement plus puissants et rapides :)
Thomas
...qoique parfois c'est super pratique ! et le syteme debain évite pas mal d'erreur humaine :-) qui sont à vrai dire les plus fréquentes .... Il ne faut pas jeter le systeme linux avec l'eau debain.
-+- Kevin in GFA : Bien configurer sa GNU/debaignoire -+-
Le ven 26 déc 2003 à 15:40, Marc a tapoté :
| Re-bonjour ;-)
Re :)
| Avant tout, Merci pour cette réponse rapide !
:)
| > Horreur.
| > Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup
| > plus portable.
|
| Portable ? Pourquoi ? Un "/bin/sh" revient uniquement à préciser le shell
| que l'on veut utiliser pour l'exécution d'un script, non ? En fait, la
Oui.
| portablilité du "code", je ne vois pas trop, car les shells semblent avoir
| pas mal de différences, y compris pour des choses "basiques" comme un test
| d'égalité ! Il semble que ce soit :
Justement. L'utilisation de /bin/sh est (presque) la même sur tous
les OS POSIX. Alors que les shells sont totalement différents et
certains ne sont même pas installés : bash n'est pas le shell par
défaut de tous les OS, de même pour csh, tcsh, ksh, etc. Chacun
d'eux est le shell par défaut d'un OS et pas sur les autres. C'est
pourquoi utiliser /bin/sh permet d'utiliser le même script partout
(ou presque : il y a toujours quelques cas gênants :).
| Sinon, sur mon Linux (Mandrake 9.1), /bin/sh est un lien vers bash !
Oui, comme bien souvent actuellement. Cependant bash, lorsqu'il est
appelé en tant que /bin/sh a un comportement (plus ou moins) fidèle
aux règles POSIX.
| Et un "tcsh monScript" ne fonctionne pas: problème de syntaxe avec while.
Et oui : tcsh n'est pas /bin/sh.
| Bref, la portablitié ? J'ai raté qqch ?
Tout :)
| > sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp
|
| Il semble que l'option -e ne soit utile que s'il y a plusieurs commandes
| d'édition ! Auquel cas il faut faire sed -e 'xxx' -e 'yyy' ...
Non. Tu peux utiliser l'option -e avec une seule commande. Ça fait
des années que je l'utilise ainsi. Tu peux même l'utiliser avec
plusieurs commandes sans la spécifier plusieurs fois :
sed -e 'commande1;commande2;commande3'
| Sinon, je suppose que mon script initial perdait l'indentation parce que
| 'read' ignore en début de ligne tout ce qui est 'espace', tabulations,
| etc...?
D'une part.
Et d'autre part 2 boucles plus une réécriture ligne par ligne du
fichier, à la main, c'est vraiment pas du tout efficace alors qu'il
y a des outils pour ça nettement plus puissants et rapides :)
Thomas
...qoique parfois c'est super pratique ! et le syteme debain évite pas mal
d'erreur humaine :-) qui sont à vrai dire les plus fréquentes ....
Il ne faut pas jeter le systeme linux avec l'eau debain.
-+- Kevin in GFA : Bien configurer sa GNU/debaignoire -+-
Le ven 26 déc 2003 à 15:40, Marc a tapoté : | Re-bonjour ;-)
Re :)
| Avant tout, Merci pour cette réponse rapide !
:)
| > Horreur. | > Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup | > plus portable. | | Portable ? Pourquoi ? Un "/bin/sh" revient uniquement à préciser le shell | que l'on veut utiliser pour l'exécution d'un script, non ? En fait, la
Oui.
| portablilité du "code", je ne vois pas trop, car les shells semblent avoir | pas mal de différences, y compris pour des choses "basiques" comme un test | d'égalité ! Il semble que ce soit :
Justement. L'utilisation de /bin/sh est (presque) la même sur tous les OS POSIX. Alors que les shells sont totalement différents et certains ne sont même pas installés : bash n'est pas le shell par défaut de tous les OS, de même pour csh, tcsh, ksh, etc. Chacun d'eux est le shell par défaut d'un OS et pas sur les autres. C'est pourquoi utiliser /bin/sh permet d'utiliser le même script partout (ou presque : il y a toujours quelques cas gênants :).
| Sinon, sur mon Linux (Mandrake 9.1), /bin/sh est un lien vers bash !
Oui, comme bien souvent actuellement. Cependant bash, lorsqu'il est appelé en tant que /bin/sh a un comportement (plus ou moins) fidèle aux règles POSIX.
| Et un "tcsh monScript" ne fonctionne pas: problème de syntaxe avec while.
Et oui : tcsh n'est pas /bin/sh.
| Bref, la portablitié ? J'ai raté qqch ?
Tout :)
| > sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp | | Il semble que l'option -e ne soit utile que s'il y a plusieurs commandes | d'édition ! Auquel cas il faut faire sed -e 'xxx' -e 'yyy' ...
Non. Tu peux utiliser l'option -e avec une seule commande. Ça fait des années que je l'utilise ainsi. Tu peux même l'utiliser avec plusieurs commandes sans la spécifier plusieurs fois : sed -e 'commande1;commande2;commande3'
| Sinon, je suppose que mon script initial perdait l'indentation parce que | 'read' ignore en début de ligne tout ce qui est 'espace', tabulations, | etc...?
D'une part. Et d'autre part 2 boucles plus une réécriture ligne par ligne du fichier, à la main, c'est vraiment pas du tout efficace alors qu'il y a des outils pour ça nettement plus puissants et rapides :)
Thomas
...qoique parfois c'est super pratique ! et le syteme debain évite pas mal d'erreur humaine :-) qui sont à vrai dire les plus fréquentes .... Il ne faut pas jeter le systeme linux avec l'eau debain.
-+- Kevin in GFA : Bien configurer sa GNU/debaignoire -+-
Marc
Re-bonjour ;-)
Avant tout, Merci pour cette réponse rapide !
Horreur. Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup plus portable.
Portable ? Pourquoi ? Un "/bin/sh" revient uniquement à préciser le shell que l'on veut utiliser pour l'exécution d'un script, non ? En fait, la portablilité du "code", je ne vois pas trop, car les shells semblent avoir pas mal de différences, y compris pour des choses "basiques" comme un test d'égalité ! Il semble que ce soit : - pour bash : if [ $i -eq 5 ] ... fi - pour tcsh : if ( $i==5 ) ... endif
Sinon, sur mon Linux (Mandrake 9.1), /bin/sh est un lien vers bash ! Et un "tcsh monScript" ne fonctionne pas: problème de syntaxe avec while.
Bref, la portablitié ? J'ai raté qqch ?
sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp
Il semble que l'option -e ne soit utile que s'il y a plusieurs commandes d'édition ! Auquel cas il faut faire sed -e 'xxx' -e 'yyy' ...
Sinon, je suppose que mon script initial perdait l'indentation parce que 'read' ignore en début de ligne tout ce qui est 'espace', tabulations, etc...?
Thomas Nemeth wrote:
Le ven 26 déc 2003 à 14:29, Marc a tapoté : | Bonjour,
Bonjour.
| Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en trouve | aucun (francophone, du moins) qui soit consacré à la programmation en | bash ?
Horreur. Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup plus portable.
| rm *.php.tmp -f | ls *.php | while read fichierPHP; do | cat $fichierPHP | while read ligneFichier; do | ligneModifiee="${ligneFichier//width="512"/width="554"}"
rm -f *.php.tmp for fichierPHP in *.php; do sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp # Et, si tu veux : mv -f $fichierPHP.tmp $fichierPHP done
| Toute aide bienvenue ! D'avance, MERCI !!!
Avec plaisir.
Thomas
Re-bonjour ;-)
Avant tout, Merci pour cette réponse rapide !
Horreur.
Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup
plus portable.
Portable ? Pourquoi ? Un "/bin/sh" revient uniquement à préciser le shell
que l'on veut utiliser pour l'exécution d'un script, non ? En fait, la
portablilité du "code", je ne vois pas trop, car les shells semblent avoir
pas mal de différences, y compris pour des choses "basiques" comme un test
d'égalité ! Il semble que ce soit :
- pour bash : if [ $i -eq 5 ] ... fi
- pour tcsh : if ( $i==5 ) ... endif
Sinon, sur mon Linux (Mandrake 9.1), /bin/sh est un lien vers bash !
Et un "tcsh monScript" ne fonctionne pas: problème de syntaxe avec while.
Bref, la portablitié ? J'ai raté qqch ?
sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp
Il semble que l'option -e ne soit utile que s'il y a plusieurs commandes
d'édition ! Auquel cas il faut faire sed -e 'xxx' -e 'yyy' ...
Sinon, je suppose que mon script initial perdait l'indentation parce que
'read' ignore en début de ligne tout ce qui est 'espace', tabulations,
etc...?
Thomas Nemeth wrote:
Le ven 26 déc 2003 à 14:29, Marc a tapoté :
| Bonjour,
Bonjour.
| Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en trouve
| aucun (francophone, du moins) qui soit consacré à la programmation en
| bash ?
Horreur.
Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup
plus portable.
| rm *.php.tmp -f
| ls *.php | while read fichierPHP; do
| cat $fichierPHP | while read ligneFichier; do
|
ligneModifiee="${ligneFichier//width="512"/width="554"}"
rm -f *.php.tmp
for fichierPHP in *.php; do
sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp
# Et, si tu veux :
mv -f $fichierPHP.tmp $fichierPHP
done
Horreur. Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup plus portable.
Portable ? Pourquoi ? Un "/bin/sh" revient uniquement à préciser le shell que l'on veut utiliser pour l'exécution d'un script, non ? En fait, la portablilité du "code", je ne vois pas trop, car les shells semblent avoir pas mal de différences, y compris pour des choses "basiques" comme un test d'égalité ! Il semble que ce soit : - pour bash : if [ $i -eq 5 ] ... fi - pour tcsh : if ( $i==5 ) ... endif
Sinon, sur mon Linux (Mandrake 9.1), /bin/sh est un lien vers bash ! Et un "tcsh monScript" ne fonctionne pas: problème de syntaxe avec while.
Bref, la portablitié ? J'ai raté qqch ?
sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp
Il semble que l'option -e ne soit utile que s'il y a plusieurs commandes d'édition ! Auquel cas il faut faire sed -e 'xxx' -e 'yyy' ...
Sinon, je suppose que mon script initial perdait l'indentation parce que 'read' ignore en début de ligne tout ce qui est 'espace', tabulations, etc...?
Thomas Nemeth wrote:
Le ven 26 déc 2003 à 14:29, Marc a tapoté : | Bonjour,
Bonjour.
| Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en trouve | aucun (francophone, du moins) qui soit consacré à la programmation en | bash ?
Horreur. Surtout pas spécialisée en un shell. Faire du /bin/sh est beaucoup plus portable.
| rm *.php.tmp -f | ls *.php | while read fichierPHP; do | cat $fichierPHP | while read ligneFichier; do | ligneModifiee="${ligneFichier//width="512"/width="554"}"
rm -f *.php.tmp for fichierPHP in *.php; do sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp # Et, si tu veux : mv -f $fichierPHP.tmp $fichierPHP done
| Toute aide bienvenue ! D'avance, MERCI !!!
Avec plaisir.
Thomas
TiChou
Dans l'article news:3fec2b0e$0$29093$, Thomas Nemeth écrivait :
Le ven 26 déc 2003 à 14:29, Marc a tapoté :
Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en trouve aucun (francophone, du moins) qui soit consacré à la programmation en bash ?
fr.comp.os.unix
rm *.php.tmp -f ls *.php | while read fichierPHP; do cat $fichierPHP | while read ligneFichier; do
rm -f *.php.tmp for fichierPHP in *.php; do sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp # Et, si tu veux : mv -f $fichierPHP.tmp $fichierPHP done
sed -i -e 's/width="512"/width="544"/g' *.php
-- TiChou
Dans l'article news:3fec2b0e$0$29093$636a55ce@news.free.fr,
Thomas Nemeth <thomas@exether.vipere.noire> écrivait :
Le ven 26 déc 2003 à 14:29, Marc a tapoté :
Pardonnez-moi si je ne poste pas dans le bon forum, mais je n'en
trouve aucun (francophone, du moins) qui soit consacré à la
programmation en bash ?
fr.comp.os.unix
rm *.php.tmp -f
ls *.php | while read fichierPHP; do
cat $fichierPHP | while read ligneFichier; do
rm -f *.php.tmp
for fichierPHP in *.php; do
sed -e 's/width="512"/width="544"/g' $fichierPHP >
$fichierPHP.tmp # Et, si tu veux :
mv -f $fichierPHP.tmp $fichierPHP
done
rm -f *.php.tmp for fichierPHP in *.php; do sed -e 's/width="512"/width="544"/g' $fichierPHP > $fichierPHP.tmp # Et, si tu veux : mv -f $fichierPHP.tmp $fichierPHP done
sed -i -e 's/width="512"/width="544"/g' *.php
-- TiChou
Thomas Nemeth
Le sam 27 déc 2003 à 02:23, TiChou a tapoté : | | sed -i -e 's/width="512"/width="544"/g' *.php
exether[~] sed -i sed: option invalide -- i
Thomas --- fu2 bàs. -- BOFH excuse #119: Evil hackers from Serbia.
Le sam 27 déc 2003 à 02:23, TiChou a tapoté :
|
| sed -i -e 's/width="512"/width="544"/g' *.php
exether[~] sed -i
sed: option invalide -- i
Thomas --- fu2 bàs.
--
BOFH excuse #119:
Evil hackers from Serbia.