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

Modification de fichiers texte et gestion des caractères spéciaux avec sed, awk, perl

7 réponses
Avatar
Eric Veiras Galisson
------=_Part_16374_15990949.1153471493276
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Bonjour =E0 tous,

j'essaye de modifier massivement des fichiers sur un serveur, principalemen=
t
des fichiers html ou php. J'en profite pour apprendre =E0 le faire =E0 la f=
ois
avec sed, awk et perl.

J'essaye en fait d'ajouter une ligne apr=E8s un 'pattern' trouv=E9.

Les solutions que j'ai trouv=E9 sont les suivantes :

sed : sed -e '/pattern/ aNouvelleLigne' fichier.txt

awk : awk '/PATTERN/ {print $1"\napres"}' fichier.txt

perl : perl -pi.bak -e 's/(pattern)/$1\napres/g' fichier.txt

Tout est ok, sauf que bien =E9videmment je veux manipuler du html donc des
caract=E8res sp=E9ciaux genre
<a href=3D"http://mon.example.tld" class=3Dlien>Lien</a>
et que ni sed, ni awk ni perl ne semble appr=E9cier (par d=E9faut...) les /=
, <,
>

Comment faire alors pour que sed/awk/perl ne reconnaisse pas ces caract=E8r=
es
sp=E9ciaux ou que je puisse les "annuler"...
(sachant que bien =E9videmment, j'ai d=E9j=E0 chang=E9 le caract=E8re de s=
=E9paration /
par !)

merci

--=20
Eric Veiras Galisson

------=_Part_16374_15990949.1153471493276
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

Bonjour =E0 tous,<br>
<br>
j'essaye de modifier massivement des fichiers sur un serveur,
principalement des fichiers html ou php. J'en profite pour apprendre =E0
le faire =E0 la fois avec sed, awk et perl.<br>
<br>
J'essaye en fait d'ajouter une ligne apr=E8s un 'pattern' trouv=E9.<br>
<br>
Les solutions que j'ai trouv=E9 sont les suivantes :<br>
<br>
sed : sed -e '/pattern/ aNouvelleLigne' fichier.txt<br>
<br>
awk : awk '/PATTERN/ {print $1&quot;\napres&quot;}' fichier.txt<br>
<br>
perl : perl -pi.bak -e 's/(pattern)/$1\napres/g' fichier.txt<br>
<br>
Tout est ok, sauf que bien =E9videmment je veux manipuler du html donc des =
caract=E8res sp=E9ciaux genre<br>
&lt;a href=3D&quot;<a href=3D"http://mon.example.tld">http://mon.example.tl=
d</a>&quot; class=3Dlien&gt;Lien&lt;/a&gt;<br>
et que ni sed, ni awk ni perl ne semble appr=E9cier (par d=E9faut...) les /=
, &lt;, &gt;<br>
<br>
Comment faire alors pour que sed/awk/perl ne reconnaisse pas ces caract=E8r=
es sp=E9ciaux ou que je puisse les &quot;annuler&quot;...<br>
(sachant que bien =E9videmment, j'ai d=E9j=E0 chang=E9 le caract=E8re de s=
=E9paration / par !)<br>
<br>
merci<br clear=3D"all"><br>-- <br>Eric Veiras Galisson

------=_Part_16374_15990949.1153471493276--


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

7 réponses

Avatar
Marc Chantreux
Bonjour,

le 21/07/2006,
Eric Veiras Galisson nous écrivait :

salut

et que ni sed, ni awk ni perl ne semble apprécier (par défaut... ) les /,



tu peux utiliser un autre symbole pour delimiter tes motifs :

perl -lpe 's#pattern1#pattern2#'
perl -lne 'm{pattern} and print '




--
téléphone : 03.90.24.00.19
courriel :
---------------------------------------
Avatar
Eric Veiras Galisson
------=_Part_17858_24651646.1153476696797
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

On 7/21/06, Marc Chantreux wrote:

Bonjour,

le 21/07/2006,
Eric Veiras Galisson nous écrivait :

salut

> et que ni sed, ni awk ni perl ne semble apprécier (par défaut... ) les
/,

tu peux utiliser un autre symbole pour delimiter tes motifs :

perl -lpe 's#pattern1#pattern2#'
perl -lne 'm{pattern} and print '





c'est déjà ce que j'ai fait, à la fois pour sed, awk et perl en utili sant !
au lien de / comme délimiteur (et non pas caractère de séparation com me je
l'ai écrit plus haut)


--
Eric Veiras Galisson

------=_Part_17858_24651646.1153476696797
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable
Content-Disposition: inline

<br><br><div><span class="gmail_quote">On 7/21/06, <b class="gmail_send ername">Marc Chantreux</b> &lt;<a href="mailto: asbg.fr"></a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Bonjour,<br><br>le 21/07/2006,<br>Eric Veiras Galisson nous écrivait :<br ><br>salut<br><br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;et que ni sed, ni awk ni perl ne semble apprécier (par défaut...) les /,<br><br>tu peux utiliser un autre symbole pour delimiter tes motifs :
<br><br>perl -lpe 's#pattern1#pattern2#'<br>perl -lne 'm{pattern} and print '</blockquote><div><br>
<br>
c'est déjà ce que j'ai fait, à la fois pour sed, awk et perl en
utilisant ! au lien de / comme délimiteur (et non pas caractère de
séparation comme je l'ai écrit plus haut)<br>
</div></div><br clear="all"><br>-- <br>Eric Veiras Galisson

------=_Part_17858_24651646.1153476696797--


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Marc Chantreux
le 21/07/2006,
Eric Veiras Galisson nous écrivait :
c'est déjà ce que j'ai fait, à la fois pour sed, awk et perl e n utilisant
! au lien de / comme délimiteur (et non pas caractère de sépar ation comme
je l'ai écrit plus haut)



pourrais tu nous donner un cas concret avec une source, une commande et
un message d'erreur. Nous aurions moins de difficulté a cerner ton
problème.

--
téléphone : 03.90.24.00.19
courriel :
---------------------------------------
Avatar
Eric Veiras Galisson
On 7/21/06, Marc Chantreux wrote:
le 21/07/2006,
Eric Veiras Galisson nous écrivait :
> c'est déjà ce que j'ai fait, à la fois pour sed, awk et perl e n utilisant
> ! au lien de / comme délimiteur (et non pas caractère de sépar ation comme
> je l'ai écrit plus haut)

pourrais tu nous donner un cas concret avec une source, une commande et
un message d'erreur. Nous aurions moins de difficulté a cerner ton
problème.



En effet, j'aurais au moins pu donner le message d'erreur... désolé.

Voilà.

J'ai un fichier html comme celui-ci (je l'ai simplifié) :
<tr>
<td class="sstitre"><div align="left">
<a
href="http://mon.domaine.tld/informatique/accueil.html"
class=lienTitre>Accueil</a><BR>
<a
href="http://mon.domaine.tld/informatique/contact.html"
class=lienTitre>Coordonnées</a><BR>
<a
href="http://mon.domaine.tld/informatique/securite.html"
class=lienTitre>Sécurité</a><BR>
<a
href="http://mon.domaine.tld/informatique/services.html"
class=lienTitre>Services</a><BR>
</div>
</td>
</tr>

et je veux insérer derrière la ligne "Services" un autre lien vers un W iki

si je lance avec awk cette commande :

$ awk '#<a href="http://mon.domaine.tld/informatique/services.html"
class=lienTitre>Services</a># {print $1"n<a
href="http://wiki.domaine.tld/wiki" class=lienTitre>Wiki</a>"}'
fichier.html

je n'ai aucun message d'erreur mais aucune modification non plus de mon fic hier

(j'ai suivi ton conseil et remplacé mon ! par #, parce qu'avec le !
j'avais des messages d'erreur... ce n'était pas une bonne idée
d'utiliser ce symbole...)

Avec sed
$ sed -ei '#<a href="http://mon.domaine.tld/informatique/services.html"
class=lienTitre>Services</a># a<a href="http://wiki.domaine.tld/wiki"
class=lienTitre>Wiki</a>' fichier.html

J'ai le message

sed: -e expression n°1, caractère 1: attendu après `a', `c' ou `i'

surement dû au '<' juste après.


Par contre, si j'utilise perl

$ perl -pi.bak -e 's#(<a
href="http://mon.domaine.tld/informatique/services.html"
class=lienTitre>Services</a>)#$1<BR>n<a
href="http://wiki.domaine.tld/wiki" class=lienTitre>Wiki</a>#g'
test.html

là, ça marche bien, donc mon problème est résolu, mais j'aurais
néanmoins aimé pouvoir le faire avec sed et awk.





--
Eric Veiras Galisson
Avatar
Eric Veiras Galisson
On 7/21/06, Guy Roussin wrote:
Bonjour,

Peut-être faut-il protéger les caractères spéciaux avec des ?



c'est ce à quoi j'ai en partie pensé, (et ce pourquoi j'ai posté ici)
parce que dans ce cas :
1. avec quel caractère ? est-ce vraiment '' qu'il faut utiliser ?
2. quels caractère faut-il protéger ? '/' ok, mais ':' également ? '< ' ? '>' ?
3. n'y a-t-il pas un moyen de lui dire de ne pas "évaluer" ses
caractère spéciaux ?

(pour awk et sed)



--
Eric Veiras Galisson
Avatar
Sylvain Sauvage
Vendredi 21 juillet 2006, 15:40:52 CEST, Eric Veiras Galisson a écrit :
[...]
si je lance avec awk cette commande :

$ awk '#<a href="http://mon.domaine.tld/informatique/services.html"
class=lienTitre>Services</a># {print $1"n<a
href="http://wiki.domaine.tld/wiki" class=lienTitre>Wiki</a>"}'
fichier.html

je n'ai aucun message d'erreur mais aucune modification non plus de mon
fichier



awk attend forcément un / pour une regexp, comme tu lui donnes #, il
prend ça pour une expression. Voir le manuel de awk, je m'en sers
rarement avec des expressions complexes.

(j'ai suivi ton conseil et remplacé mon ! par #, parce qu'avec le !
j'avais des messages d'erreur... ce n'était pas une bonne idée
d'utiliser ce symbole...)



Normal, en bash (et autres sh), ! sert pour la gestion d'historiques.
(Et, s'il est « simple-quoté », c'est l'opérateur non.)

Avec sed
$ sed -ei '#<a href="http://mon.domaine.tld/informatique/services.html"
class=lienTitre>Services</a># a<a href="http://wiki.domaine.tld/wiki"
class=lienTitre>Wiki</a>' fichier.html



Sed peut prendre d'autres caractères que / comme marqueur de regexp, si
on suit ces règles :
- après une commande, aucun problème (p.ex. 's:a:b:' est pareil que
's/a/b/) ;
- avant une commande (c'est-à-dire comme adresse), il faut protéger le
premier : '/a/,/b/ s/x/y/' peut devenir ':a:,,b, s!x!y!'

Par contre, si j'utilise perl

$ perl -pi.bak -e 's#(<a
href="http://mon.domaine.tld/informatique/services.html"
class=lienTitre>Services</a>)#$1<BR>n<a
href="http://wiki.domaine.tld/wiki" class=lienTitre>Wiki</a>#g'
test.html

là, ça marche bien, donc mon problème est résolu, mais j'aurais
néanmoins aimé pouvoir le faire avec sed et awk.



Je ne connais pas bien perl mais sans doute est-ce parce que tu places la
regexp après la commande 's' (comme cela fonctionnerait avec sed (sauf
que non à cause du saut ligne)).

--
Sylvain Sauvage


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Eric Veiras Galisson
Si je comprends bien, avec awk et sed, c'est super difficile de faire
des manips sur des chaines aussi compliquées et vu que je connais un
peu perl et que je l'utilise sur des machines ou il est présent
(debian !), il faut mieux que j'utilise perl ?

Bon, je regarderais dans les manuels avancés de sed et awk voir si je
trouve (et comprends :) comment manipuler des chaines aussi
compliquées.
En attendant je vais utiliser perl, et vous remercie de votre aide.



On 7/21/06, Sylvain Sauvage wrote:
Vendredi 21 juillet 2006, 15:40:52 CEST, Eric Veiras Galisson a écrit :
>[...]
> si je lance avec awk cette commande :
>
> $ awk '#<a href="http://mon.domaine.tld/informatique/services.html"
> class=lienTitre>Services</a># {print $1"n<a
> href="http://wiki.domaine.tld/wiki" class=lienTitre>Wiki</a>"}'
> fichier.html
>
> je n'ai aucun message d'erreur mais aucune modification non plus de mon
> fichier

awk attend forcément un / pour une regexp, comme tu lui donnes #, il
prend ça pour une expression. Voir le manuel de awk, je m'en sers
rarement avec des expressions complexes.

> (j'ai suivi ton conseil et remplacé mon ! par #, parce qu'avec le !
> j'avais des messages d'erreur... ce n'était pas une bonne idée
> d'utiliser ce symbole...)

Normal, en bash (et autres sh), ! sert pour la gestion d'historiques.
(Et, s'il est « simple-quoté », c'est l'opérateur non.)

> Avec sed
> $ sed -ei '#<a href="http://mon.domaine.tld/informatique/services.htm l"
> class=lienTitre>Services</a># a<a href="http://wiki.domaine.tld/wik i"
> class=lienTitre>Wiki</a>' fichier.html

Sed peut prendre d'autres caractères que / comme marqueur de regexp, si
on suit ces règles :
- après une commande, aucun problème (p.ex. 's:a:b:' est pareil que
's/a/b/) ;
- avant une commande (c'est-à-dire comme adresse), il faut protéger l e
premier : '/a/,/b/ s/x/y/' peut devenir ':a:,,b, s!x!y!'

> Par contre, si j'utilise perl
>
> $ perl -pi.bak -e 's#(<a
> href="http://mon.domaine.tld/informatique/services.html"
> class=lienTitre>Services</a>)#$1<BR>n<a
> href="http://wiki.domaine.tld/wiki" class=lienTitre>Wiki</a>#g'
> test.html
>
> là, ça marche bien, donc mon problème est résolu, mais j'aurais
> néanmoins aimé pouvoir le faire avec sed et awk.

Je ne connais pas bien perl mais sans doute est-ce parce que tu places la
regexp après la commande 's' (comme cela fonctionnerait avec sed (sauf
que non à cause du saut ligne)).

--
Sylvain Sauvage


--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.net/?DebianFrench
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact .org






--
Eric Veiras Galisson