OVH Cloud OVH Cloud

[Bash] substituer une chaine par une autre

5 réponses
Avatar
Marc
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
?

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")

Toute aide bienvenue ! D'avance, MERCI !!!

5 réponses

Avatar
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." -+-

Avatar
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 -+-

Avatar
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"}"

| 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


Avatar
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



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


sed -i -e 's/width="512"/width="544"/g' *.php

--
TiChou


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