Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1351 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Regex pour remplacement de &

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Regex pour remplacement de &

n°2312370
antp
Super Administrateur
Champion des excuses bidons
Posté le 09-03-2018 à 18:12:29  profilanswer
 

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
mood
Publicité
Posté le 09-03-2018 à 18:12:29  profilanswer
 

n°2312371
antp
Super Administrateur
Champion des excuses bidons
Posté le 12-03-2018 à 11:34:31  profilanswer
 

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
n°2312384
Cutter
Posté le 12-03-2018 à 12:57:09  profilanswer
 

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


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

---------------
last.fm
n°2312388
antp
Super Administrateur
Champion des excuses bidons
Posté le 12-03-2018 à 13:37:57  profilanswer
 

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
n°2312429
antp
Super Administrateur
Champion des excuses bidons
Posté le 12-03-2018 à 19:10:14  profilanswer
 

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
n°2312437
MaybeEijOr​Not
but someone at least
Posté le 12-03-2018 à 21:15:00  profilanswer
 

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.
n°2312443
antp
Super Administrateur
Champion des excuses bidons
Posté le 12-03-2018 à 22:27:37  profilanswer
 

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
n°2312452
gilou
Modérateur
Modzilla
Posté le 13-03-2018 à 09:27:12  profilanswer
 

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é!  --
n°2312478
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-03-2018 à 16:18:29  profilanswer
 

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
n°2312503
MaybeEijOr​Not
but someone at least
Posté le 13-03-2018 à 20:34:50  profilanswer
 

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.
mood
Publicité
Posté le 13-03-2018 à 20:34:50  profilanswer
 

n°2312504
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-03-2018 à 20:42:57  profilanswer
 

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
n°2312505
MaybeEijOr​Not
but someone at least
Posté le 13-03-2018 à 21:06:11  profilanswer
 

Sinon cf. EDIT 2.


---------------
C'est en écrivant n'importe quoi qu'on devient n'importe qui.
n°2312507
antp
Super Administrateur
Champion des excuses bidons
Posté le 13-03-2018 à 23:21:37  profilanswer
 

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
n°2312519
gilou
Modérateur
Modzilla
Posté le 14-03-2018 à 10:40:02  profilanswer
 

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é!  --
n°2312525
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-03-2018 à 12:49:05  profilanswer
 

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
n°2312546
gilou
Modérateur
Modzilla
Posté le 14-03-2018 à 18:54:40  profilanswer
 

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é!  --
n°2312548
antp
Super Administrateur
Champion des excuses bidons
Posté le 14-03-2018 à 19:50:04  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Regex pour remplacement de &

 

Sujets relatifs
Regex : capturer toutes les itérations d'un groupe capturant +filtre avec REGEX
Detection et remplacement stringscript perl pour remplacement des chiffre en mots
Regex Split tableau[PHP] pourquoi ma regex ne marche pas ?
[Regex] prenant en compte le caractère "à"[Perl] simplifier ma regex
[Général] Efficacité des Regex pour le remplacement d'occurrences?[RESOLU]Boucle dans remplacement regex
Plus de sujets relatifs à : Regex pour remplacement de &


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR