Regex pour remplacement de &

Regex pour remplacement de & - Shell/Batch - Programmation

Marsh Posté le 09-03-2018 à 18:12:29    

Hello,
Suite à un souci de migration j'aimerais remplacer tous les & qui ne sont pas des entités HTML par des & dans un dump sql.
J'ai donc en vrac dans mon fichier des trucs genre "foo & bar", "foo&bar", "foo > bar", "foo " bar", etc.
Il n'y a que les deux premiers cas que je devrais remplacer par &
Donc je dois remplacer les & ne satisfaisant pas au pattern &#?[a-zA-Z0-9]+;
Une idée ? (en général je me débrouille bien avec les regex mais là je cale)
 
Bonus : si je peux faire ça avec sed ou autre truc en ligne de commande ça m'arrange, mais j'ai toujours un doute sur ce qu'il faut escaper ou non :D
(OS = Fedora 27 Cloud Edition)
Sinon je peux toujours me débrouiller pour le faire en PHP.
 
J'hésitais entre poster ici et sur Prog, si ça fait un bide (comme le peu de topics que je fais) je le bougerai...


Message édité par antp le 12-03-2018 à 11:34:07

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 09-03-2018 à 18:12:29   

Reply

Marsh Posté le 12-03-2018 à 11:34:31    

Ce sujet a été déplacé de la catégorie Linux et OS Alternatifs vers la categorie Programmation par Antp

 

edit: comme prévu, ça a fait un bide sur OSA :o


Message édité par antp le 12-03-2018 à 11:35:04

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-03-2018 à 12:57:09    

Un negative lookahead ?
 
&(?!#?[a-zA-Z0-9]+;)


Message édité par Cutter le 12-03-2018 à 13:03:50

---------------
last.fm
Reply

Marsh Posté le 12-03-2018 à 13:37:57    

J'avais essayé un truc du genre sans succès, mais j'avais peut-être fait une erreur de syntaxe, je re-testerai :jap:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-03-2018 à 19:10:14    

J'arrive pas à le faire marcher en ligne de commande par contre
 

sed 's/&(?!#?[a-zA-Z0-9]+;)/\\&/g' A.sql > B.sql


ne semble rien faire (que ce soit avec un ou deux \ devant le &amp)
et si je rajoute le param -r il me dit "Invalid preceding regular expression" après le &amp [:figti]


Message édité par antp le 12-03-2018 à 19:10:25

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 12-03-2018 à 21:15:00    

C'est vraiment la saison des regex. :pt1cable:  
 
Ne peut-on pas inverser le problème c'est à dire en ne remplaçant que les string " & " par " & " ?
 

Code :
  1. sed 's/ & / \& /g' A.sql > B.sql


Cela peut éventuellement débloquer la situation en évitant d'utiliser -r mais je ne connais pas sed.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 12-03-2018 à 22:27:37    

Non parce que j'ai pas mal d'URL qui contiennent des params avec des &, où il y a donc du texte des deux côtés du &, et qui ne sont du coup pas valides ; il y a probablement peu de & seuls.
Je tenterai de faire le recherche/remplace en php ou en C#, je manie ça un peu mieux que sed et la ligne de commande Linux :D


Message édité par antp le 12-03-2018 à 22:28:28

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-03-2018 à 09:27:12    

Si tu en as besoin en perl, s/&(?!(quot;|amp;|apos;|lt;|gt;|#\d+;|#x[[:xdigit:]]+;))/&/; fait le taf.
 
A+,


Message édité par gilou le 13-03-2018 à 09:27:23

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-03-2018 à 16:18:29    

je connais pas perl donc ça va pas m'aider :D
(à moins que tu puisses me donner la ligne de commande à taper pour faire la modif dans le fichier)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-03-2018 à 20:34:50    

Cela ne change pas grand chose à ce que proposais Cutter, c'est juste une forme plus exhaustive.
La question c'est de savoir se en effet il faut utiliser le paramètre -r dans sed pour les expressions régulières basées sur des assertions. Et que personne ne semble maitriser sed.

 

EDIT : mais d'après les premières recherches google, il n'est pas possible d'utiliser d'assertion avec sed. :s

 

EDIT 2 : conclusion, pas possible avec sed à moins de travailler en deux temps avec une première substitution comme j'avais proposé pour le texte et deuxième substitution pour les paramètres d'URL, probablement un truc du genre :

Code :
  1. sed 's/&(.+)=/\&\1=/g' A.sql > B.sql


Message édité par MaybeEijOrNot le 13-03-2018 à 20:49:53

---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 13-03-2018 à 20:34:50   

Reply

Marsh Posté le 13-03-2018 à 20:42:57    

ah bah ça résout donc le problème :D
Je ferai ça demain en C#, ça prendra quelques minutes le temps de download/réuploader le fichier :o  
(faudrait que j'installe de quoi faire du C# sur mon serveur...)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 13-03-2018 à 21:06:11    

Sinon cf. EDIT 2.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
Reply

Marsh Posté le 13-03-2018 à 23:21:37    

Y a sans doute aussi d'autres trucs que des URL ou des & seuls, donc le plus simple/sûr sera de passer par quelques lignes de code :D
Merci ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-03-2018 à 10:40:02    

antp a écrit :

je connais pas perl donc ça va pas m'aider :D
(à moins que tu puisses me donner la ligne de commande à taper pour faire la modif dans le fichier)


Sous linux
perl -pi -e 's/&(?!(quot;|amp;|apos;|lt;|gt;|#\d+;|#x[[:xdigit:]]+;))/&/g;' *
devrait faire l'affaire (ou tu remplaces le * final par un path plus précis vers tes fichiers si necessaire)
Sous windows, c'est un poil plus coton, de faire fonctionner correctement la ligne de commande avec perl.
 
A+,


Message édité par gilou le 14-03-2018 à 10:40:31

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-03-2018 à 12:49:05    

Comment je lui file le fichier en entrée et sortie ?
Sous Windows je le fais en C#, je ferai ça cet aprem, ça sera fait en 10 min temps de download & upload compris :D

 

edit: bon c'est fait en C#
J'ai toujours des soucis dans certains posts, mais nettement moins, et je ne trouve pas ce qui foire dans le restant, ça restera comme ça :o
(ils ont fait des changements dans phpbb 3.2, ils chargent les posts comme du XML, mais quand ça échoue ça donne une erreur un peu violente à la place de la page :/)


Message édité par antp le 14-03-2018 à 17:58:23

---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 14-03-2018 à 18:54:40    

Ah! la c'était pour s’exécuter sur des fichier (l'argument *) et les modifier en place (le flag i).
Sinon
perl -p -e 's/&(?!(quot;|amp;|apos;|lt;|gt;|#\d+;|#x[[:xdigit:]]+;))/&/g;' [fichier-en-entrée] > [fichier-en-sortie]  
pour quelque chose de plus explicite, sur un seul fichier en entrée, et un fichier en sortie qui a un autre nom.
 
A+,


Message édité par gilou le 14-03-2018 à 18:55:02

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-03-2018 à 19:50:04    

ah oui j'avais pas fait gaffe au "*" à la fin :D
Enfin là comme je disais c'est fait en C#, mais merci ;)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed