OVH Cloud OVH Cloud

BBedit replace de "aa" jusqu'à "bb"

11 réponses
Avatar
voirSignature
Je débute avec BBedit pour convertir des pages html faite avec des
tableaux vers du CSS propre. J'ai fait un Applescript pour convertir
chaque page. principalement suppression des tab <td> et autres
remplacement, suppression.

Mon problème de débutant, je voudrais supprimer du texte où je connais
le début et la fin, mais avec un milieu variable en longueur (donc un
simple wildcard ne suffit pas). exemple

aa ddddddd bb
aa qqq bb

ma commande devrait donc être replace de "aa" jusqu'à "bb"

Je viens de passer plus d'une heure à lire le manuel de BBedit et je
patauge toujours. A l'aide. Merci.


Alain Le Gallou
Email : alain4

10 réponses

1 2
Avatar
voirSignature
Alain Le Gallou wrote:


ma commande devrait donc être replace de "aa" jusqu'à "bb"



Trouvé, c'est :

aa(.*)bb

le point en wildcard et l'astérisque comme répétiteur.

J'avais pas trouvé dans le help de BBedit, mais plus facilement dans
http://www.anybrowser.org/bbedit/grep.shtml


Alain Le Gallou
Email : alain4

Avatar
Daniel
ma commande devrait donc être replace de "aa" jusqu'à "bb"



Trouvé, c'est :

aa(.*)bb


De mémoire, pour une phrase tel que:
"aa hello world ! bb aa I am citizen of the Universe bb"
l'expression aa(.*)bb capturera:
" hello world ! bb aa I am citizen of the Universe "
et non pas
"hello world !" & "I am citizen of the Universe"

L'expression "aa((?!bb)*)bb" me semble plus adaptée, mais nous pouvons
encore affinée la reconnaissance.
Si l'on prend comme exemple:
"aa Je ne connais pas l'éditeur bbedit bb"
l'expression reconnaîtra uniquement " Je ne connais pas l'éditeur ".
Il serait alors bon de délimiter la suite de caractères de
reconnaissance afin de ne pas couper un mot en deux.
Notre expression devient alors: <aa>((?!<bb>)*)<bb>
Avec < et > on donne le sens "mot" à aa et bb

Pour reconnaître le texte entre des balises HTML: <aa>((?!</aa>)*)</aa>


NB1: Ces expressions captures les espaces après aa et avant bb.
NB2: J'ignore si bbedit gère les regex

Daniel


Avatar
romer
Alain Le Gallou wrote:

Trouvé, c'est :

aa(.*)bb

le point en wildcard et l'astérisque comme répétiteur.

J'avais pas trouvé dans le help de BBedit, mais plus facilement dans
http://www.anybrowser.org/bbedit/grep.shtml


Si - regarde mieux dans le manuel de BBedit qui est sur leur site. C'est
le chapitre excellent qui traite des expressions régulières. Tu y
trouveras des explications et exemples pour résoudre ce cas.
--
A+

Romer

Avatar
Jaypee
Daniel wrote:

ma commande devrait donc être replace de "aa" jusqu'à "bb"




Trouvé, c'est :

aa(.*)bb



De mémoire, pour une phrase tel que:
"aa hello world ! bb aa I am citizen of the Universe bb"
l'expression aa(.*)bb capturera:
" hello world ! bb aa I am citizen of the Universe "
et non pas
"hello world !" & "I am citizen of the Universe"

...


Daniel
C'est la notion de "gourmandise", ou de "greedy match". Et selon

la doc, BBedit est systématiquement gourmant.
La doc le signale et recommande d'utiliser d' exclure aa comme
motif interne :
aa([^aa]*)bb
[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.

Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire".
Dans les regexps, habituellement, on peut nommer le contenu des
parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.

Selon ce qu'on souhaite le remplacement sera donc :
aaxyzbb ou simplement xyz.

J-P



Avatar
patpro ~ Patrick Proniewski
In article <44186fbf$0$19683$,
Jaypee wrote:

Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire".
Dans les regexps, habituellement, on peut nommer le contenu des
parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.



si tu veux dire par là que BBEdit ne sais pas faire ça :

chercher : toto(titi)tutu(tata)
remplacer par : toto2tutu1
obtenir : tototatatututiti

alors tu devrais lire la doc.


patpro

Avatar
blanc
Jaypee wrote:

Par ailleurs, BBedit ne connaît pas les parenthèses comme "mémoire".
Dans les regexps, habituellement, on peut nommer le contenu des
parenthèses avec $1, $2 etc pour préciser de remplacer $1 par xyz.


Bien sûr que si il les reconnait !
Seulement c'est 1 et 2 qu'il faut utiliser au lieu de $1 et $2.

Par exemple dans le texte ci-dessus, si je cherche :

ne(.*)pas(.*)comme

et le remplace par

1 parfaitement 2 mais pas comme

j'obtiens pour la première ligne :

<< Par ailleurs, BBedit connaît parfaitement les parenthèses mais
pas comme "mémoire". >>


Je signale aussi que dans certains systèmes de regexp on doit utiliser
( et ) au lieu de ( et )

JPaul.



--
/==/==- Jean-Paul BLANC
/ /--/--// quelque-part (somewhere)
|/| L | en (in)
/|| = ||| FRANCE

Avatar
Daniel
C'est la notion de "gourmandise", ou de "greedy match".
C'est justement le sujet de mon intervention.


Et selon la doc, BBedit est systématiquement gourmant.
c'est malheureux, ça limite son champ d'action.


La doc le signale et recommande d'utiliser d' exclure aa comme
motif interne :
aa([^aa]*)bb
qui est de toute manière syntaxiquement incorrecte.


[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.
tout sauf a, aa, aaa ou a peut être répété de 0 à x fois, en fait

[^a]* reconnaîtrait la même chose que [^aa]*

Mes explications n'étant pas toujours claires, une ptite démo en ligne
de commande s'impose:
echo "aa a la maison bb, je suis chez moi." | sed "s/aa([^aa]*)bb/**1**/"

sort le résultat:
aa a la maison bb, je suis chez moi.

alors que la commande:
echo "aa je suis chez moi bb, a la maison." | sed "s/aa([^aa]*)bb/**1**/"

sort:
** je suis chez moi **, a la maison.

on constate que [^a]* ou [^aa]* réalise la même chose

--
Daniel

Avatar
Jaypee
Daniel wrote:

C'est la notion de "gourmandise", ou de "greedy match".


C'est justement le sujet de mon intervention.

Et selon la doc, BBedit est systématiquement gourmant.


c'est malheureux, ça limite son champ d'action.

La doc le signale et recommande d'utiliser d' exclure aa comme
motif interne :
aa([^aa]*)bb


qui est de toute manière syntaxiquement incorrecte.

[^aa]* signifiant : tout sauf aa, répété 0 ou plusieurs fois.


tout sauf a, aa, aaa ou a peut être répété de 0 à x fois, en fait
[^a]* reconnaîtrait la même chose que [^aa]*

Mes explications n'étant pas toujours claires, une ptite démo en ligne
de commande s'impose:
echo "aa a la maison bb, je suis chez moi." | sed
"s/aa([^aa]*)bb/**1**/"

sort le résultat:
aa a la maison bb, je suis chez moi.

alors que la commande:
echo "aa je suis chez moi bb, a la maison." | sed
"s/aa([^aa]*)bb/**1**/"

sort:
** je suis chez moi **, a la maison.

on constate que [^a]* ou [^aa]* réalise la même chose

--
Daniel


OK, j'ai mérité ma leçon, fort intéressante au demeurant.

Donc si on a:
<b>le texte à extraire</b> et <b>encore un autre morceau</b>
et que l'on souhaite virer les balises, on peut faire comme çà:

chercher : (<b>([^<b>]*)(</b>)
et remplacer par : 2
et on obtient alors :
le texte à extraire et encore un autre morceau

J-P


Avatar
laurent.pertois
Daniel wrote:

Et selon la doc, BBedit est systématiquement gourmant.
c'est malheureux, ça limite son champ d'action.



Je n'y connais pas grand chose en grep, mais voici quand même ce que je
lis dans la doc de BBEdit :

To work around this "longest match" behavior, you can modify your
pattern to take advantage of non-greedy quantifiers.


--
Politically Correct Unix - UTILITIES
The "touch" command has been removed from the standard distribution due
to its inappropriate use by high-level managers.


Avatar
Daniel
Donc si on a:
<b>le texte à extraire</b> et <b>encore un autre morceau</b>
et que l'on souhaite virer les balises, on peut faire comme çà:

chercher : (<b>([^<b>]*)(</b>)
et remplacer par : 2
Pour extraire un texte entre balise, utiliser [^] n'est pas correcte.

Pour faire concis, l'expression ne reconnaîtra pas le bloc de caractère
comme ceci "<" suivi de "b" suivi de ">" mais comme "<" ou "b" ou ">",
ce qui signifie que la reconnaissance s'arrêtera (dû à la négation ^) au
premier b ou chevron rencontré. Il est préférable d'utiliser un test
avant négatif "((?!</b>)*)" qui fait exactement ce que l'on souhaite.
Sauf si traitement particulier, le premier jeu de parenthèse est inutile
et est consommatrice de ressources.
L'expression devrait être "<b>((?!</b>)*)</b>", et 1 est le texte
capturé.

--
Daniel

1 2