SED et le expressions régulières

Résolu/Fermé
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009 - 11 mai 2007 à 15:15
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 - 18 mai 2007 à 14:05
Rebonjour,

Je me suis mis au REGEX ===>aille...

Je souhaite en fait en fait effacer toute les lignes ou j'ai l'occurence FR en 18ème et 19ème caractères et pas les autres dans un fichier qui contient quelque chose du genre:

0123456789 58FR fkdlshjjkdfhuidghku
0123456789 58LA fkdlshjjkdfhuidghku
0123456789 58FR fkdlshjjkdfhuidghku
0123456789 58IT fkdlshjjkdfhuidghku
012FR56789 58UK fkdlshjjkdfhuidghku
0123456789 58FR fkdlshjjkdfhuidghku



J'ai trouvé la REGEX: \w qui signifie :

Matches any alphanumeric character; this is equivalent to the class [a-zA-Z0-9_]

et je dois donc l'utiliser avec la commande delete de sed mais comment??

D'avance merci BAV

7 réponses

mamiemando Messages postés 33078 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 22 avril 2024 7 749
11 mai 2007 à 16:11
(mando@cenedra) (~) $ cat plop.txt
01234567890123467FRfkdlshjjkdfhuidghku
0123456789 58LA fkdlshjjkdfhuidghku
0123456789aaaa 57FR fkdlshjjkdfhuidghku
012345678958IT fkdlshjjkdfhuidghku
012FR56789 58UK fkdlshjjkdfhuidghku
0123456789 58FR fkdlshjjkdfhuidghku

(mando@cenedra) (~) $ grep ".\{17\}FR" plop.txt
01234567890123467FRfkdlshjjkdfhuidghku
0123456789aaaa 57FR fkdlshjjkdfhuidghku

Bonne chance
0
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
11 mai 2007 à 16:50
Merci beaucoup, j'ai juste modifié la regex comme suit:

sed "s/^.\{13\}FR/ligne FR effacee/" tstdel.txt

Bonne journée.

BAT et merci
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
11 mai 2007 à 17:14
Salut,

attention avec l'ancrage
au début tu demandes les positions 18 et 19
avec ancrage ça ne marche pas
Pourquoi?
Discutons ta regex /^.\{13\}FR/
En ce cas l'ancrage oblige le départ au début de chaîne, donc seulement FR après les premières caractères sera reconnu et pas le 14 ème (en supposant que tu voulais les 2 - vu ta question)

En revanche ce que Miss t'a donné est très correct.
Pourquoi?
Si nous n'utilisons pas l'ancrage alors . peux reconnaître le 1er caractère de la chaîne 13 fois et ensuite trouver le 14ème et le 15ème F et R

Si F se trouve dans la position 15 et 16 (ce que veut dire après 14 caractères) la regex de Miss fonctionne mais pas la tienne.

Rappelle toi que je t'ai dit que le moteur n'est pas intelligent mais persévèrent et exhaustif. Donc le moteur va chercher d'abord en commencent avec le 1er caractère (et il va trouver F en postion 14 et R en position 15) ensuite comme il est persévèrent il va recommencer la recherche à partir de la position 2 donc il va trouver d'abord 13 caractères et ensuite un F (qui en réalité dans la chaîne est à la position 15) et puis un R (qui est en réalité dans la position 16)

Voilà pour exemple (la reconnaissance était dans les lignes 1 et 3, j'ai rajouté un caractères pour avoir F dans les 2 position 17 et 18 - voir en gras)
lami20j@debian:~/trash$ cat plop.txt
01234567890123467FRfkdlshjjkdfhuidghku
0123456789 58LA fkdlshjjkdfhuidghku
0123456789aaaa 57ZFR fkdlshjjkdfhuidghku
012345678958IT fkdlshjjkdfhuidghku
012FR56789 58UK fkdlshjjkdfhuidghku
0123456789 58FR fkdlshjjkdfhuidghku

1. la solution de Miss (pas d'ancrage)
lami20j@debian:~/trash$ grep -nE '.{17}FR' plop.txt
1:01234567890123467FRfkdlshjjkdfhuidghku
3:0123456789aaaa 57ZFR fkdlshjjkdfhuidghku

2. ta solution (avec ancrage)
lami20j@debian:~/trash$ grep -nE '^.{17}FR' plop.txt
1:01234567890123467FRfkdlshjjkdfhuidghku
donc cette fois le moteur se contente de chercher seulement en commençant avec le début de la chaîne puisque tu l'obliges en utilisant ^ ( début de chaîne)
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
11 mai 2007 à 19:26
Je crois que j'ai mal compris.
En fait quand on parle des regex on parle caractères par caractères
on dit F en position 18 suit d'un R en position 19 et pas FR en postion 18 et 19 (d'où le fait que j'ai mal compris) - mea culpa :-)

en ce cas tu as bien ancrer ta regex
et la solution de Miss n'est pas très performante si on a un couple F dans la position 19 suit de R dans la position 20
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
tht123 Messages postés 72 Date d'inscription mardi 8 mai 2007 Statut Membre Dernière intervention 10 janvier 2009
18 mai 2007 à 12:43
Hello L'ami20j!

Ok et merci pour tes explications cela se désembrume peu à peu!

tiens SED n'est pas intelligent, mais pourrais-je envisager des combinaisons logiques??

Ex aulieu de chercher seulement FR je voudrais par exemple

FR OU TR OU...OU XY???

J'ai essayé en remplacant FR dans la regex d'avant par :

1) FR\|TR\|XY
2) (FR\|TR\|XY)
3) [FR\|TR\|XY]

Mais cela n'a rien donné??

BAT @+
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
18 mai 2007 à 13:48
sed 's/^.*\(FR\|TR\|XY\)/Ligne \1 EFFACEE/' fichier.txt
--
lami20j
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 895
18 mai 2007 à 14:05
Salut,
 sed '/FR\|TR\|XY/c"Ligne EFFACEE"' fichier
;-))
0