OVH Cloud OVH Cloud

Remplacement de chaines de caractères dans un (ou des) fichier(s).

24 réponses
Avatar
Séverin TERRIER
Bonjour à tou(te)s,

J'aurais besoin d'effectuer des remplacements de chaines de caractères dans
un (ou des) fichier(s).

Le remplacement devra se faire pour remplacer des pseudo-balises par des
balises HTML, ou l'inverse.

On utilisera donc une liste de paire <element> <element_remplacant>, pour
définir les différentes chaines à remplacer, dans le(s) fichier(s). Enfin,
c'est comme ça que je vois les choses...

Précision d'échelle :
- le nombre de paires sera assez limité (<10)
- la taille des fichiers est faible (<10 Ko)
- le nombre de fichiers est faible (<100).

Les fichiers dans lesquels le remplacement devra avoir lieu seront répartis
dans plusieurs répertoires, a raison d'un seul fichier .ext a remplacer
dans chaque répertoire (le répertoire contenant d'autres fichiers à
ignorer).

Le passage de commande précisera l'opération (codage/décodage), ainsi que
le ou les fichiers à traiter.

Je ne sais pas si je peux faire ça le plus simplement/efficacement
directement en shell unix (+ awk, sed...), ou en utilisant perl (par
exemple)...

Donc si vous avez des idées, exemples, script déjà établis, je suis
preneur, sachant que je suis débutant en script et perl...

Merci d'avance pour votre aide.
--
http://severinterrier.free.fr/Boot/ Tout est gratuit et en français.
CD de dépannage basé sur XP (ou 2003) avec interface graphique,
multitâche, support NTFS (lecture/écriture), réseau, gravure...
CD ou DVD Ultime, permettant d'installer plusieurs versions de
Windows, d'avoir des outils de dépannage, et beaucoup plus...
Disquettes de boot modulaires (support CD-Rom, réseau, NTFS, noms longs)

10 réponses

1 2 3
Avatar
Séverin TERRIER
Bonjour,

Stephane Chazelas écrivait dans
news: :

2004-09-15, 14:24(+00), Séverin TERRIER:
[...]
s/<(.*?)>/[$1]/g

remplace les <toto> par [toto].


Oui, ça, je comprends bien.

Mais ayant plusieurs chaines à remplacer, je mets plusieurs
occurences de la commande de remplacement s ?


Oui, separees par des ";".

s/a/b/g;s/foo/bar/g


Merci pour cette réponse.

Je viens de voir la réponse de Pascal Bourguignon, qui correspondrait plus
à ce que je voudrais faire (plus facilement adaptable).

Il faut que je test...

Bonne journée.
--
http://severinterrier.free.fr/Boot/ Tout est gratuit et en français.
CD de dépannage basé sur XP (ou 2003) avec interface graphique,
multitâche, support NTFS (lecture/écriture), réseau, gravure...
CD ou DVD Ultime, permettant d'installer plusieurs versions de
Windows, d'avoir des outils de dépannage, et beaucoup plus...
Disquettes de boot modulaires (support CD-Rom, réseau, NTFS, noms longs)



Avatar
Séverin TERRIER
Bonjour,

Pascal Bourguignon écrivait dans
news: :

J'aurais besoin d'effectuer des remplacements de chaines de
caractères dans un (ou des) fichier(s).

Le remplacement devra se faire pour remplacer des pseudo-balises par
des balises HTML, ou l'inverse.

On utilisera donc une liste de paire <element> <element_remplacant>,
pour définir les différentes chaines à remplacer, dans le(s)
fichier(s). Enfin, c'est comme ça que je vois les choses...

Précision d'échelle :
- le nombre de paires sera assez limité (<10)
- la taille des fichiers est faible (<10 Ko)
- le nombre de fichiers est faible (<100).

Les fichiers dans lesquels le remplacement devra avoir lieu seront
répartis dans plusieurs répertoires, a raison d'un seul fichier .ext
a remplacer dans chaque répertoire (le répertoire contenant d'autres
fichiers à ignorer).

Le passage de commande précisera l'opération (codage/décodage), ainsi
que le ou les fichiers à traiter.

Je ne sais pas si je peux faire ça le plus simplement/efficacement
directement en shell unix (+ awk, sed...), ou en utilisant perl (par
exemple)...

Donc si vous avez des idées, exemples, script déjà établis, je suis
preneur, sachant que je suis débutant en script et perl...


Tu ferais mieux de débuter en common-lisp...


Il va falloir que j'essaie alors...

La solution décrite correspond à priori exactement à ce que je demandais.
Il ne me reste qu'à tester...

Merci et bonne journée.
--
http://severinterrier.free.fr/Boot/ Tout est gratuit et en français.
CD de dépannage basé sur XP (ou 2003) avec interface graphique,
multitâche, support NTFS (lecture/écriture), réseau, gravure...
CD ou DVD Ultime, permettant d'installer plusieurs versions de
Windows, d'avoir des outils de dépannage, et beaucoup plus...
Disquettes de boot modulaires (support CD-Rom, réseau, NTFS, noms longs)


Avatar
Stephane Chazelas
2004-09-15, 15:12(+00), Pascal Bourguignon:
[...]
#!/usr/bin/clisp -ansi -q


Note que cette syntaxe fonctionnera sur tres peu de systemes. La
plupart n'acceptent qu'un argument sur la ligne de shebang.
Voir: http://www.in-ulm.de/~mascheck/various/shebang/

[...]
(defun displaced-vector (vector start &optional end)
"Same as SUBSEQ but with a displaced array."
(setf end (or end (length vector)))
(assert (<= 0 start (length vector)) (start)
"START should be an integer between 0 and ~D, not ~D"
(length vector) start)
(assert (<= start end (length vector)) (end)
"END should be an integer between ~D and ~D, not ~D"
start (length vector) end)
(make-array (list (- end start))
:element-type (array-element-type vector)
:displaced-to vector
:displaced-index-offset start));;displaced-vector
[...]


Ca a beau etre rigolo comme language, ca reste quand meme
plutot illisible...

--
Stephane

Avatar
Pascal Bourguignon
Stephane Chazelas writes:

2004-09-15, 15:12(+00), Pascal Bourguignon:
[...]
#!/usr/bin/clisp -ansi -q


Note que cette syntaxe fonctionnera sur tres peu de systemes. La
plupart n'acceptent qu'un argument sur la ligne de shebang.


J'ai déjà utilisé un certain nombre d'unix différents et de
différentes versions, et aucun refuse plus d'un argument.

couche "unix" sur CDC, A/UX, AIX, Solaris d'il y a 10 ans,
4.2BSD, 4.3BSD, 4.4BSD avec leur variantes et descendants,
Linux, etc.

De nos jours, la plupart des systèmes unix = MacOSX !

Et étant donnée la facilité et la gratuité d'obtention de systèmes
unix non bogué, si on a un système qui n'accepte qu'un seul argument
#!, je conseillerais de l'effacer et d'installer Linux ou un *BSD.

Voir: http://www.in-ulm.de/~mascheck/various/shebang/


D'accord, allons voir:

| maximum |cut-off(c)|only the|each arg|
| length of|error(err)|1st arg |in its |
| #!-line: |or ENOEXEC|passed |own |
OS [(Hardware)] | |( ) [1]|on |argv[x] |
----------------------+----------+----------+--------+--------+
AIX 3.2.5 (rs6k) | > 80 [3] | [3] | | |
AIX 4.3.2 (rs6k) | 256 | | | |
FreeBSD 1.1-4.4 | 64 | | | X |
FreeBSD 4.5-(4.7) | 128 | err | | X |
HP-UX A.08.07 (700) | 32 | | | |
HP-UX B.09.03 (300) | 32 | | | |
HP-UX B.10.10 | > 80 [4] | [4] | | |
HP-UX B.10.20-B.11.11 | 128 | | | |
IRIX 5.3 (mips) | 256 | err | | |
IRIX 6.5 (mips) | 256 | err | | |
Linux 2.2.9-2.6.7(x86)| 127 | c | | |
MUNIX3.1 SVR3.x(68K) | 32 | | | |
NetBSD 0.8-1.6Q | 64 | | | |
NetBSD 1.6R-(1.6.2rc2)| 1024 | | | |
OpenBSD 2.0-(3.4) | 64 | | | |
OSF1 V4.0,T5.1 Alpha | 1024 | | | |
OpenServer5.0.6[5] | 256 | err | X | |
Sinix 5.20 | 32 | | | |
SunOS 4.1.4 (SPARC) | 32 | c | | |
SunOS 5.x (SPARC) | 1024 | | X | |
Ultrix 4.5 (vax) | 80 | ? | X | |
----------------------+----------+----------+--------+--------+

Conclusion, pour Stephane Chazelas, "la plupart" ça commence au moins
à partir de 3/21 ! (Personnellement, et je pense que pour la majorité
des francophones, "la plupart' ça commence à 51%).


Tu aurais pu plutôt te plaindre que cette ligne #! n'aurait pas
fonctionné sur un système unix original (Research Unix between Version
7 and 8), car elle fait plus de 16 caractères, et je t'aurais répondu
que ça n'avait absolument aucune importance car clisp ne tourne pas
sur ces vieux systèmes!


C'est bien d'être pédant, mais il faut l'être à bon escient!

[...]
(defun displaced-vector (vector start &optional end)
[...]


Ca a beau etre rigolo comme language, ca reste quand meme
plutot illisible...


La lisibilité, c'est comme la beauté: dans l'oeuil de celui qui voit.

--
__Pascal Bourguignon__ http://www.informatimago.com/

Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we.


Avatar
Nicolas George
Pascal Bourguignon wrote in message
:
| maximum |cut-off(c)|only the|each arg|
| length of|error(err)|1st arg |in its |
| #!-line: |or ENOEXEC|passed |own |
OS [(Hardware)] | |( ) [1]|on |argv[x] |
----------------------+----------+----------+--------+--------+
AIX 3.2.5 (rs6k) | > 80 [3] | [3] | | |
AIX 4.3.2 (rs6k) | 256 | | | |
FreeBSD 1.1-4.4 | 64 | | | X |
FreeBSD 4.5-(4.7) | 128 | err | | X |
HP-UX A.08.07 (700) | 32 | | | |
HP-UX B.09.03 (300) | 32 | | | |
HP-UX B.10.10 | > 80 [4] | [4] | | |
HP-UX B.10.20-B.11.11 | 128 | | | |
IRIX 5.3 (mips) | 256 | err | | |
IRIX 6.5 (mips) | 256 | err | | |
Linux 2.2.9-2.6.7(x86)| 127 | c | | |
MUNIX3.1 SVR3.x(68K) | 32 | | | |
NetBSD 0.8-1.6Q | 64 | | | |
NetBSD 1.6R-(1.6.2rc2)| 1024 | | | |
OpenBSD 2.0-(3.4) | 64 | | | |
OSF1 V4.0,T5.1 Alpha | 1024 | | | |
OpenServer5.0.6[5] | 256 | err | X | |
Sinix 5.20 | 32 | | | |
SunOS 4.1.4 (SPARC) | 32 | c | | |
SunOS 5.x (SPARC) | 1024 | | X | |
Ultrix 4.5 (vax) | 80 | ? | X | |
----------------------+----------+----------+--------+--------+

Conclusion, pour Stephane Chazelas, "la plupart" ça commence au moins
à partir de 3/21 ! (Personnellement, et je pense que pour la majorité
des francophones, "la plupart' ça commence à 51%).


Non : il faut aussi compter la dernière colonne, et dans ce cas, ça fait
19/21.

Avatar
Pascal Bourguignon
Nicolas George <nicolas$ writes:

Pascal Bourguignon wrote in message
:
| maximum |cut-off(c)|only the|each arg|
| length of|error(err)|1st arg |in its |
| #!-line: |or ENOEXEC|passed |own |
OS [(Hardware)] | |( ) [1]|on |argv[x] |
----------------------+----------+----------+--------+--------+
AIX 3.2.5 (rs6k) | > 80 [3] | [3] | | |
AIX 4.3.2 (rs6k) | 256 | | | |
FreeBSD 1.1-4.4 | 64 | | | X |
FreeBSD 4.5-(4.7) | 128 | err | | X |
HP-UX A.08.07 (700) | 32 | | | |
HP-UX B.09.03 (300) | 32 | | | |
HP-UX B.10.10 | > 80 [4] | [4] | | |
HP-UX B.10.20-B.11.11 | 128 | | | |
IRIX 5.3 (mips) | 256 | err | | |
IRIX 6.5 (mips) | 256 | err | | |
Linux 2.2.9-2.6.7(x86)| 127 | c | | |
MUNIX3.1 SVR3.x(68K) | 32 | | | |
NetBSD 0.8-1.6Q | 64 | | | |
NetBSD 1.6R-(1.6.2rc2)| 1024 | | | |
OpenBSD 2.0-(3.4) | 64 | | | |
OSF1 V4.0,T5.1 Alpha | 1024 | | | |
OpenServer5.0.6[5] | 256 | err | X | |
Sinix 5.20 | 32 | | | |
SunOS 4.1.4 (SPARC) | 32 | c | | |
SunOS 5.x (SPARC) | 1024 | | X | |
Ultrix 4.5 (vax) | 80 | ? | X | |
----------------------+----------+----------+--------+--------+

Conclusion, pour Stephane Chazelas, "la plupart" ça commence au moins
à partir de 3/21 ! (Personnellement, et je pense que pour la majorité
des francophones, "la plupart' ça commence à 51%).


Non : il faut aussi compter la dernière colonne, et dans ce cas, ça fait
19/21.


Je veux bien admettre la 4e colonne, mais ça fait 5/21 ce qui reste
encore largement une minorité et non pas "la plupart".

--
__Pascal Bourguignon__ http://www.informatimago.com/

Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we.


Avatar
Nicolas George
Pascal Bourguignon wrote in message
:
Je veux bien admettre la 4e colonne, mais ça fait 5/21 ce qui reste
encore largement une minorité et non pas "la plupart".


Non, non, non : _seuls_ ceux avec la cinquième colonne cochée
fonctionneront. Sur les autres, soit bien 19/21 (et en nombre de postes dans
le monde, ça doit être encore plus), cette ligne-là :

#!/usr/bin/clisp -ansi -q

exécutera clisp avec deux arguments : "-ansi -q" et le nom du script, et pas
trois arguments.

Avatar
Pascal Bourguignon
Nicolas George <nicolas$ writes:

Pascal Bourguignon wrote in message
:
Je veux bien admettre la 4e colonne, mais ça fait 5/21 ce qui reste
encore largement une minorité et non pas "la plupart".


Non, non, non : _seuls_ ceux avec la cinquième colonne cochée
fonctionneront. Sur les autres, soit bien 19/21 (et en nombre de postes dans
le monde, ça doit être encore plus), cette ligne-là :

#!/usr/bin/clisp -ansi -q

exécutera clisp avec deux arguments : "-ansi -q" et le nom du script, et pas
trois arguments.


D'accord, j'ai inversé la colonne.

Il manque MacOSX et Linux 2.4 et 2.6 qui sépare aussi. Comme le noyau
de darwin n'est pas celui de FreeBSD, on doit considérer MacOSX
séparément.

Alors quand on enlève MacOSX, Linux et FreeBSD, on a enlevé 99.999%
des unix actuels! 


--
__Pascal Bourguignon__ http://www.informatimago.com/

Our enemies are innovative and resourceful, and so are we. They never
stop thinking about new ways to harm our country and our people, and
neither do we.


Avatar
Nicolas George
Pascal Bourguignon wrote in message
:
Il manque MacOSX et Linux 2.4 et 2.6 qui sépare aussi.


Euh, non :

Linux 2.2.9-2.6.7(x86)| 127 | c | | |





Et je confirme :

ssecem /tmp $ cat t
#!/tmp/printargs un deux trois j'irai dans les bois
ssecem /tmp $ ./t
argv[0] = "/tmp/printargs"
argv[1] = "un deux trois j'irai dans les bois"
argv[2] = "./t"
ssecem /tmp $ uname -a
Linux ssecem 2.6.5 #2 Wed Apr 14 23:36:02 CEST 2004 i686 GNU/Linux

Linux 2.6 ne sépare pas les arguments, et si je me souviens bien, 2.4 non
plus.




Avatar
Stephane Chazelas
2004-09-16, 20:14(+00), Nicolas George:
[...]
Linux 2.6 ne sépare pas les arguments, et si je me souviens bien, 2.4 non
plus.


Oui, il n'y a en gros que FreeBSD et ses dérivés (de la liste
mentionnee dans le site de Sven Mascheck). On peut y rajouter
Hurd qui a aussi l'air de considerer que le reste de la ligne
est *l*'argument.

http://savannah.gnu.org/cgi-bin/viewcvs/~checkout~/hurd/hurd/exec/hashexec.c

Je n'avais pas l'intention d'etre pedant

Dans:

#! /interpreter son unique argument

Ce qu'il y a apres "/interpreter" est en general un unique
argument (c'est le standard de fait sur lequel la plupart des
Unix semblent s'appuyer, on ne peut pas vraiment appeler ca un
bug), sauf exceptions que liste le site de Sven Mascheck.

POSIX ne specifie rien au sujet du hashbang. D'ailleurs, il ne
specifie pas non plus le chemin du shell POSIX conformant (c'est
ainsi que ce n'est pas toujours "/bin/sh" comme sur Solaris), ni
du getconf qui permettrait de le connaitre.

--
Stephane

1 2 3