Regex pour remplacement de & - Shell/Batch - Programmation
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
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
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 &)
et si je rajoute le param -r il me dit "Invalid preceding regular expression" après le &
Marsh Posté le 12-03-2018 à 21:15:00
C'est vraiment la saison des regex.
Ne peut-on pas inverser le problème c'est à dire en ne remplaçant que les string " & " par " & " ?
Code :
|
Cela peut éventuellement débloquer la situation en évitant d'utiliser -r mais je ne connais pas sed.
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
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+,
Marsh Posté le 13-03-2018 à 16:18:29
je connais pas perl donc ça va pas m'aider
(à moins que tu puisses me donner la ligne de commande à taper pour faire la modif dans le fichier)
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 :
|
Marsh Posté le 13-03-2018 à 20:42:57
ah bah ça résout donc le problème
Je ferai ça demain en C#, ça prendra quelques minutes le temps de download/réuploader le fichier
(faudrait que j'installe de quoi faire du C# sur mon serveur...)
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
Merci
Marsh Posté le 14-03-2018 à 10:40:02
antp a écrit : je connais pas perl donc ça va pas m'aider :D |
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+,
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
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
(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 )
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+,
Marsh Posté le 14-03-2018 à 19:50:04
ah oui j'avais pas fait gaffe au "*" à la fin
Enfin là comme je disais c'est fait en C#, mais merci
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
(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