Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

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
Jean-Philippe Caruana

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


le fichier source est du XML ?
alors utilisez un parser XML avec XSLT

(et du coup, allez voir chez fr.comp.text.xml, mais après vous être
documenté...)

bon courage

--
jpc
http://www.enstimac.fr/~caruana/

Avatar
Stephane Chazelas
2004-09-15, 13:42(+00), Séverin TERRIER:
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.
[...]


perl -pi.back -e 's/quelquechose/autrechose/g' **/*.ext(.)

(en supposant que le shell est zsh).

--
Stephane

Avatar
Séverin TERRIER
Re-bonjour,

et merci de cette réponse rapide.

Stephane Chazelas écrivait dans
news: :

2004-09-15, 13:42(+00), Séverin TERRIER:
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.
[...]


perl -pi.back -e 's/quelquechose/autrechose/g' **/*.ext(.)


Mais cette commande remplace 1 chaine par une autre, et pas DES chaines,
par d'autres, ou je me trompe...

(en supposant que le shell est zsh).


--
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,

Jean-Philippe Caruana écrivait dans
news:ci9h7g$ :


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


le fichier source est du XML ?


Heu, non, pas vraiment...

Merci quand même...
--
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, 13:58(+00), Séverin TERRIER:
[...]
perl -pi.back -e 's/quelquechose/autrechose/g' **/*.ext(.)


Mais cette commande remplace 1 chaine par une autre, et pas DES chaines,
par d'autres, ou je me trompe...
[...]


"quelquechose" est une expression rationnelle (regular
expression en Anglais). Voir perldoc perlre

--
Stephane


Avatar
Séverin TERRIER
Re-bonjour,

Stephane Chazelas écrivait dans
news: :

2004-09-15, 13:58(+00), Séverin TERRIER:
[...]
perl -pi.back -e 's/quelquechose/autrechose/g' **/*.ext(.)


Mais cette commande remplace 1 chaine par une autre, et pas DES
chaines, par d'autres, ou je me trompe...
[...]


"quelquechose" est une expression rationnelle (regular
expression en Anglais). Voir perldoc perlre


Heu, oui, mais l'aide est *vraiment* très longue, et j'ai du mal à voir
comment faire ce que je souhaiterais...

Comment spécifier la chaine de remplacement en fonction de la chaine
cherchée ?

Sachant que l'opération doit pouvoir être réversible...

Un exemple peut-être ?
--
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, 14:10(+00), Séverin TERRIER:
[...]
Comment spécifier la chaine de remplacement en fonction de la chaine
cherchée ?

Sachant que l'opération doit pouvoir être réversible...

Un exemple peut-être ?
[...]


s/<(.*?)>/[$1]/g

remplace les <toto> par [toto].

As-tu un exemple concret de ce que tu veux obtenir ?

--
Stephane

Avatar
Séverin TERRIER
Comment spécifier la chaine de remplacement en fonction de la chaine
cherchée ?

Sachant que l'opération doit pouvoir être réversible...

Un exemple peut-être ?


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 ?

Et le fichier sera parcouru une, ou plusieurs fois ?
Remarque, vu l'échelle, c'est peut-être pas grave...

As-tu un exemple concret de ce que tu veux obtenir ?


Heu, pas sous la main...

--
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
Pascal Bourguignon
"Séverin TERRIER" writes:

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


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


$ cat $(find test -type f)
<b>trick<b>word<a>unit<a><c>text<c>
<a>trick<b>word<b><a><c>wang<d>
$ ./multi-replace.lisp --codage test
Processing directory test
Processing file /local/users/pascal/src/lisp/encours/test/toto/two.ext
Processing file /local/users/pascal/src/lisp/encours/test/one.ext
$ cat $(find test -type f)
<bb>trick<bb>word<aa>unit<aa><cc>text<cc>
<aa>trick<bb>word<bb><aa><cc>wang<dd>
$ ./multi-replace.lisp --decodage test
Processing directory test
Processing file /local/users/pascal/src/lisp/encours/test/toto/two.ext
Processing file /local/users/pascal/src/lisp/encours/test/one.ext
$ cat $(find test -type f)
<b>trick<b>word<a>unit<a><c>text<c>
<a>trick<b>word<b><a><c>wang<d>

----------(multi-replace.lisp)---------------------------------------------
#!/usr/bin/clisp -ansi -q

(defparameter *replacements*
'(("<a>" "<aa>")
("<b>" "<bb>")
("<c>" "<cc>")
("<d>" "<dd>")))


;; (The following four functions are extracted from a library.)

(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


(DEFUN string-substitute (string substitutions)
(let ((chunks (list string)))
(dolist (SUB substitutions (apply (function concatenate) 'string chunks))
(when (some (lambda (chunk) (search (first sub) chunk
:test (function string=))) chunks)
(setf chunks
(mapcan
(lambda (chunk)
(do* ((start 0 (+ pos (length (first sub))))
(pos (search (first sub) chunk
:start2 start
:test (function string=))
(search (first sub) chunk
:start2 start
:test (function string=)))
(result '())
)
((null pos)
(cond
((= 0 start)
(push chunk result))
((< start (length chunk))
(push (displaced-vector chunk start) result)))
(nreverse result))
(when (< start pos)
(push (displaced-vector chunk start pos) result))
(push (second sub) result)))
chunks))))));;string-substitute

(defun read-file (path)
(with-open-file (inp path :direction :input :if-does-not-exist :error)
(let ((result (make-string (file-length inp))))
(read-sequence result inp)
result)));;read-file


(defun write-file (path text)
(with-open-file (out path :direction :output :if-does-not-exist :create
:if-exists :supersede)
(write-sequence text out)))


(defun main (arguments)
(let ((order (pop arguments))
(replacements *replacements*))
(cond
((string-equal "--decodage" order)
(setf replacements (mapcar (lambda (repl)
(list (second repl) (first repl)))
replacements)))
((not (string-equal "--codage" order))
(error "First argument must be --codage or --decodage~%")))
(dolist (directory arguments)
(format *trace-output* "~&Processing directory ~A~%" directory)
(dolist (file (directory
(merge-pathnames
(make-pathname :directory '(:relative :wild-inferiors)
:name :wild :type "ext" :version :newest)
directory)))
(format *trace-output* "~& Processing file ~A~%" file)
(write-file
file (string-substitute (read-file file) replacements))))));;main

(main ext:*args*)

----------(multi-replace.lisp)---------------------------------------------


--
__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
Stephane Chazelas
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

--
Stephane


1 2 3