Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > fr.comp.lang.regexp > #233 > unrolled thread

Regex qui supprime tout le reste de la ligne après le premier espace

Started byyamo' <news@pasdenom.info>
First post2024-12-07 20:12 +0100
Last post2024-12-09 12:16 +0100
Articles 16 — 7 participants

Back to article view | Back to fr.comp.lang.regexp


Contents

  Regex qui supprime tout le reste de la ligne après le premier espace yamo' <news@pasdenom.info> - 2024-12-07 20:12 +0100
    Re: Regex qui supprime tout le reste de la ligne après le premier espace Jo Engo <yl@icite.fr> - 2024-12-08 10:07 +0000
      Re: Regex qui supprime tout le reste de la ligne après le premier espace Olivier Miakinen <om+news@miakinen.net> - 2024-12-08 13:09 +0100
      Re: Regex qui supprime tout le reste de la ligne après le premier espace yamo' <news@pasdenom.info > - 2024-12-09 08:03 +0000
        Re: Regex qui supprime tout le reste de la ligne après le premier espace Olivier Miakinen <om+news@miakinen.net> - 2024-12-09 12:34 +0100
          Re: Regex qui supprime tout le reste de la ligne après le premier espace DV <dv@reply-to.not.invalid> - 2024-12-09 12:50 +0000
          Re: Regex qui supprime tout le reste de la ligne après le premier espace Otomatic <otomatic@oto.invalid> - 2024-12-09 18:08 +0100
            Re: Regex qui supprime tout le reste de la ligne après le premier espace Olivier Miakinen <om+news@miakinen.net> - 2024-12-10 02:29 +0100
              Re: Regex qui supprime tout le reste de la ligne après le premier espace yamo' <yamo@beurdin.invalid> - 2024-12-11 17:15 +0100
      Re: Regex qui supprime tout le reste de la ligne après le premier espace yamo' <yamo@beurdin.invalid> - 2024-12-11 17:16 +0100
        Re: Regex qui supprime tout le reste de la ligne après le premier espace Jo Engo <yl@icite.fr> - 2024-12-14 20:51 +0000
          Re: Regex qui supprime tout le reste de la ligne après le premier espace Olivier Miakinen <om+news@miakinen.net> - 2024-12-14 22:48 +0100
    Re: Regex qui supprime tout le reste de la ligne après le premier espace Olivier Miakinen <om+news@miakinen.net> - 2024-12-08 13:29 +0100
      Re: Regex qui supprime tout le reste de la ligne après le premier espace Olivier Miakinen <om+news@miakinen.net> - 2024-12-08 14:01 +0100
        Re: Regex qui supprime tout le reste de la ligne après le premier espace yamo' <news@pasdenom.info > - 2024-12-09 07:52 +0000
          Re: Regex qui supprime tout le reste de la ligne après le premier espace Olivier Miakinen <om+news@miakinen.net> - 2024-12-09 12:16 +0100

#233 — Regex qui supprime tout le reste de la ligne après le premier espace

Fromyamo' <news@pasdenom.info>
Date2024-12-07 20:12 +0100
SubjectRegex qui supprime tout le reste de la ligne après le premier espace
Message-ID<AABnVJ4ChAMAADSd.A3.flnews@yamo.pasdenom.info>
Salut,

Je suis nul en regex et j'ai besoin d'une regex qui supprime tout
 le reste d'une ligne après le premier espace
 sauf si la ligne commence par ':' :

En entrée :

:fr.* (hiérarchie francophone)
fr.bienvenue  Aide aux nouveaux venus dans leurs premiers pas sur Usenet.
fr.bio.medecine  Discussions sur la médecine.

En sortie :

:fr.* (hiérarchie francophone)
fr.bienvenue
fr.bio.medecine

Précision, il n'y a pas de lignes vides.

Merci d'avance!

-- 
Stéphane

[toc] | [next] | [standalone]


#234

FromJo Engo <yl@icite.fr>
Date2024-12-08 10:07 +0000
Message-ID<vj3r5a$i63$19@rasp.pasdenom.info>
In reply to#233
Le Sat, 7 Dec 2024 20:12:02 +0100, yamo' a écrit :

> Je suis nul en regex

Moi aussi, mais généralement je les comprends, et je peux faire des 
simples. Testé :

sed '/^:/!s/ .*$//' fichier.txt

semble faire le job, mais ce n'est pas moi qui l'ai écrit :o)



-- 
RÉALISME

M : Qu'est-ce qu'il nous faudrait pour qu'on nous considère comme des 
humains ? Un cerveau plus gros ?
P : Non... Une carte bleue suffirait...

[toc] | [prev] | [next] | [standalone]


#235

FromOlivier Miakinen <om+news@miakinen.net>
Date2024-12-08 13:09 +0100
Message-ID<vj429n$1976$1@cabale.usenet-fr.net>
In reply to#234
Le 08/12/2024 11:07, Jo Engo répondait à yamo' :
> 
>> Je suis nul en regex
> 
> Moi aussi, mais généralement je les comprends, et je peux faire des 
> simples. Testé :
> 
> sed '/^:/!s/ .*$//' fichier.txt
> 
> semble faire le job, mais ce n'est pas moi qui l'ai écrit :o)

Et en l'occurrence cette commande sed utilise non pas une mais deux regex.


La première regex cherche quelles lignes commencent par un ':' :
  /^:/

Puis on exclut ces lignes :
  !

Et enfin on effectue la substitution par une seconde regex sur les lignes
restantes :
  s/ .*$//
(noter que le '$' est inutile même s'il ne gêne pas)


Je vais maintenant chercher à répondre à la question par une seule regex, en
supposant que le moteur est compatible perl (PCRE).

-- 
Olivier Miakinen

[toc] | [prev] | [next] | [standalone]


#239

Fromyamo' <news@pasdenom.info >
Date2024-12-09 08:03 +0000
Message-ID<vj688q$bq6$1@rasp.pasdenom.info>
In reply to#234
Salut,
Jo Engo a écrit :
> Le Sat, 7 Dec 2024 20:12:02 +0100, yamo' a écrit :

>> Je suis nul en regex

> Moi aussi, mais généralement je les comprends, et je peux faire des 
> simples. Testé :

> sed '/^:/!s/ .*$//' fichier.txt

> semble faire le job, mais ce n'est pas moi qui l'ai écrit :o)

Pour moi c'est, à l'exception des plus simples, presque aussi obscur que du 
mandarin...
Surtout que j'ai le souvenir que par exemple ^ a plusieurs significations...

Et je les ai pris en grippe dès le départ. 

Je vais essayer dans la semaine et je donnerai mon retour d'expérience ! 

-- 
Stéphane 

[toc] | [prev] | [next] | [standalone]


#241

FromOlivier Miakinen <om+news@miakinen.net>
Date2024-12-09 12:34 +0100
Message-ID<vj6kjn$281a$1@cabale.usenet-fr.net>
In reply to#239
Le 09/12/2024 09:03, yamo' a écrit :
> 
>> sed '/^:/!s/ .*$//' fichier.txt
> 
>> semble faire le job, mais ce n'est pas moi qui l'ai écrit :o)
> 
> Pour moi c'est, à l'exception des plus simples, presque aussi obscur que du 
> mandarin...

J'ai expliqué cette commande sed dans ma réponse à Jo Engo.

> Surtout que j'ai le souvenir que par exemple ^ a plusieurs significations...

Il y a en tout et pour tout deux contextes dans les regexp, à savoir le contexte
global ou celui des classes de caractères (entre crochets []). Dans le contexte
global, ^ désigne le début de la ligne ou le début du texte. Tandis qu'au tout
début d'une classe de caractères cela signifie « NON » : [0-9] c'est n'importe
quel chiffre entre 0 et 9, alors que [^0-9] c'est n'importe quel caractère sauf
un chiffre entre 0 et 9.

> Et je les ai pris en grippe dès le départ. 

Avec un peu d'aide de ma part, DV a rédigé une doc pour les débutants que je
trouve particulièrement claire et accessible. Elle est très orientée pour
le logiciel MacCafé, mais elle reste pertinente dans la plupart des autres
cas (particulièrement pour PCRE) et me semble facile à lire.

Voir <http://mc.yakakwatik.org/regex/fr/>.

-- 
Olivier Miakinen

[toc] | [prev] | [next] | [standalone]


#242

FromDV <dv@reply-to.not.invalid>
Date2024-12-09 12:50 +0000
Message-ID<vj6p2t$a3k$1@rasp.pasdenom.info>
In reply to#241
Olivier Miakinen a écrit ceci :

> Avec un peu d'aide de ma part, DV a rédigé une doc pour les débutants

Un peu ? ;-)

-- 
Denis

USENET FRANCOPHONE (serveurs, passerelles, groupes, lecteurs de news, docs) :
<http://usenet-fr.yakakwatik.org>

[toc] | [prev] | [next] | [standalone]


#243

FromOtomatic <otomatic@oto.invalid>
Date2024-12-09 18:08 +0100
Message-ID<sp8eljhf8hav2s9i6rfn08mtrn196uufd6@4ax.com>
In reply to#241
Olivier Miakinen <om+news@miakinen.net> écrivait :

> Avec un peu d'aide de ma part, DV a rédigé une doc pour les débutants que je
> trouve particulièrement claire et accessible. Elle est très orientée pour
> le logiciel MacCafé, mais elle reste pertinente dans la plupart des autres
> cas (particulièrement pour PCRE) et me semble facile à lire.
> 
> Voir <http://mc.yakakwatik.org/regex/fr/>.

Je n'utilise pas les regex tous les jours, donc après un certain temps,
la mémoire fait défaut et alors je consulte documentation PHP sur le
sujet - PCRE :
https://www.php.net/manual/fr/pcre.pattern.php

Nota : Olivier m'avait donné beaucoup d'aide dans ce même forum.

[toc] | [prev] | [next] | [standalone]


#244

FromOlivier Miakinen <om+news@miakinen.net>
Date2024-12-10 02:29 +0100
Message-ID<vj85hq$2oj6$1@cabale.usenet-fr.net>
In reply to#243
Le 09/12/2024 18:08, Otomatic m'a répondu :
>> 
>> Voir <http://mc.yakakwatik.org/regex/fr/>.
> 
> https://www.php.net/manual/fr/pcre.pattern.php

Exactement. La première doc est parfaite pour débuter, et la seconde est
parfaite comme page de référence quand on cherche à répondre à une question
spécifique.

-- 
Olivier Miakinen

[toc] | [prev] | [next] | [standalone]


#245

Fromyamo' <yamo@beurdin.invalid>
Date2024-12-11 17:15 +0100
Message-ID<vjcdqb$9du$1@rasp.pasdenom.info>
In reply to#244
Salut,

Olivier Miakinen a tapoté le 10/12/2024 02:29:
> Le 09/12/2024 18:08, Otomatic m'a répondu :
>>>
>>> Voir <http://mc.yakakwatik.org/regex/fr/>.
>>
>> https://www.php.net/manual/fr/pcre.pattern.php
> 
> Exactement. La première doc est parfaite pour débuter, et la seconde est
> parfaite comme page de référence quand on cherche à répondre à une question
> spécifique.
> 

Merci, je vais d'abord lire tranquillement la première...

-- 
Stéphane
<http://pasdenom.info/news.html>

[toc] | [prev] | [next] | [standalone]


#246

Fromyamo' <yamo@beurdin.invalid>
Date2024-12-11 17:16 +0100
Message-ID<vjcdsc$9du$2@rasp.pasdenom.info>
In reply to#234
Salut,
Jo Engo a tapoté le 08/12/2024 11:07:
> sed '/^:/!s/ .*$//' fichier.txt

Ça fonctionne parfaitement!

-- 
Stéphane
<http://pasdenom.info/news.html>

[toc] | [prev] | [next] | [standalone]


#247

FromJo Engo <yl@icite.fr>
Date2024-12-14 20:51 +0000
Message-ID<vjkr4j$pdl$3@rasp.pasdenom.info>
In reply to#246
Le Wed, 11 Dec 2024 17:16:12 +0100, yamo' a écrit :

> Ça fonctionne parfaitement!

Il faut dire merci à ChatGPT, quoiqu'il est vrai que ce sont 2 regex et 
non une.



-- 
Il faut pleurer les hommes à leur naissance et non pas à leur mort.
	-+- Montesquieu -+-

[toc] | [prev] | [next] | [standalone]


#248

FromOlivier Miakinen <om+news@miakinen.net>
Date2024-12-14 22:48 +0100
Message-ID<vjkuf8$13f4$1@cabale.usenet-fr.net>
In reply to#247
Le 14/12/2024 21:51, Jo Engo a écrit :
> 
>> Ça fonctionne parfaitement!
> 
> Il faut dire merci à ChatGPT, quoiqu'il est vrai que ce sont 2 regex et 
> non une.

Il s'agissait de :

 sed '/^:/!s/ .*$//' fichier.txt

Et grâce à cela j'ai découvert le « ! » après la première regex, syntaxe de sed
que je ne connaissais pas. Sans la connaitre, j'aurais donc écrit :

 sed '/^[^:]/s/ .*$//' fichier.txt


-- 
Olivier Miakinen

[toc] | [prev] | [next] | [standalone]


#236

FromOlivier Miakinen <om+news@miakinen.net>
Date2024-12-08 13:29 +0100
Message-ID<vj43g8$19ln$1@cabale.usenet-fr.net>
In reply to#233
Le 07/12/2024 20:12, yamo' a écrit :
> 
> Je suis nul en regex et j'ai besoin d'une regex qui supprime tout
>  le reste d'une ligne après le premier espace
>  sauf si la ligne commence par ':' :
> 
> En entrée :
> 
> :fr.* (hiérarchie francophone)
> fr.bienvenue  Aide aux nouveaux venus dans leurs premiers pas sur Usenet.
> fr.bio.medecine  Discussions sur la médecine.
> 
> En sortie :
> 
> :fr.* (hiérarchie francophone)
> fr.bienvenue
> fr.bio.medecine

1re solution sans assertions
============================

Remplacer :
/^([^:][^ ]*?) .*/
par :
\1

Attention, selon ton type de regex il faudra peut-être écrire \( et \) à
la place de ( et ), ou (inclusif) écrire $1 au lieu de \1.


2e solution avec assertions
===========================

Remplacer :
/(?<=^[^:][^ ]*?) .*/
par rien.

-- 
Olivier Miakinen

[toc] | [prev] | [next] | [standalone]


#237

FromOlivier Miakinen <om+news@miakinen.net>
Date2024-12-08 14:01 +0100
Message-ID<vj45br$1aii$1@cabale.usenet-fr.net>
In reply to#236
Le 08/12/2024 13:29, j'écrivais :
> 
> 1re solution sans assertions
> ============================
> 
> Remplacer :
> /^([^:][^ ]*?) .*/
> par :
> \1

Cette 1re solution peut convenir si ton moteur de regex n'est pas de type PCRE.

> Attention, selon ton type de regex il faudra peut-être écrire \( et \) à
> la place de ( et ), ou (inclusif) écrire $1 au lieu de \1.

N'étant pas de type PCRE, il y a différentes « saveurs » de regex, d'où les
différences possibles.

> 2e solution avec assertions
> ===========================
> 
> Remplacer :
> /(?<=^[^:][^ ]*?) .*/
> par rien.

Cette 2de solution est pour les regex de type PCRE.

-- 
Olivier Miakinen

[toc] | [prev] | [next] | [standalone]


#238

Fromyamo' <news@pasdenom.info >
Date2024-12-09 07:52 +0000
Message-ID<vj67ja$an7$1@rasp.pasdenom.info>
In reply to#237
Salut,
Merci à vous deux ! 
Olivier Miakinen a écrit :
> Le 08/12/2024 13:29, j'écrivais :
>> 
>> 1re solution sans assertions
>> ============================
>> 
>> Remplacer :
>> /^([^:][^ ]*?) .*/
>> par :
>> \1

Seulement ? 

> Cette 1re solution peut convenir si ton moteur de regex n'est pas de type PCRE.

Encore un truc qui me rebute avec les regex mais c'est une des joies de 
l'informatique où chacun peut développer sa norme dans son coin...

>> Attention, selon ton type de regex il faudra peut-être écrire \( et \) à
>> la place de ( et ), ou (inclusif) écrire $1 au lieu de \1.

Quand je comprends ce que je fais, j´échappe les caractères "spéciaux".

> N'étant pas de type PCRE, il y a différentes « saveurs » de regex, d'où les
> différences possibles.

C'est un monde étrange ces regex...

>> 2e solution avec assertions
>> ===========================
>> 
>> Remplacer :
>> /(?<=^[^:][^ ]*?) .*/
>> par rien.

!?

> Cette 2de solution est pour les regex de type PCRE.

Je vais regarder la solution de Jo Engo si elle fonctionne.
Avant de peut-être un jour l'appliquer avec sed ou perl (-E ou -P?), je 
vais probablement utiliser un clickodrome comme BlueFish avant de copier le 
résultat sur le serveur...
Je sais qu'on peut directement les utiliser dans vim* mais je ne sais pas si 
je vais atteindre le niveau de confiance suffisant...

* je n'ai pas regardé si nano est aussi puissant à ce niveau là. 

-- 
Stéphane 

[toc] | [prev] | [next] | [standalone]


#240

FromOlivier Miakinen <om+news@miakinen.net>
Date2024-12-09 12:16 +0100
Message-ID<vj6jjh$27hh$1@cabale.usenet-fr.net>
In reply to#238
Le 09/12/2024 08:52, yamo' a écrit :
> Salut,
> Merci à vous deux ! 
> Olivier Miakinen a écrit :
>> Le 08/12/2024 13:29, j'écrivais :
>>> 
>>> 1re solution sans assertions
>>> ============================
>>> 
>>> Remplacer :
>>> /^([^:][^ ]*?) .*/
>>> par :
>>> \1
> 
> Seulement ? 

Oui.

Ça veut dire la chose suivante :
  ^                Commencer au début de la ligne
  ([^:][^ ]*?)     Tout ce bloc sera capturé. Je le décris en détail en dessous
    [^:]             Le premier caractère ne doit pas être un deux-points
    [^ ]*?           Les caractères suivants ne doivent pas être des espaces
  (espace).*       Là on prend une espace puis tout ce qui suit jusqu'à la fin

Donc, d'après ce qui précède, si une ligne ne commence pas par un deux-points,
tous les premiers caractères sans espaces sont capturés par les parenthèses
(...), et à partir de la première espace c'est pris en compte mais pas capturé.

Du coup, quand on le remplace par $1 ou \1, cela veut dire qu'on ne recopie que
ce qui avait été capturé par les parenthèses.

>> Cette 1re solution peut convenir si ton moteur de regex n'est pas de type PCRE.
> 
> Encore un truc qui me rebute avec les regex mais c'est une des joies de 
> l'informatique où chacun peut développer sa norme dans son coin...

C'est surtout une raison historique. Au début les regexp n'étaient pas très
évoluées et on ne savait pas capturer avec des parenthèses, c'étaient donc
des caractères sans signification. Quand on a pensé à capturer avec des
parenthèses, ceux qui ont développé les regex améliorées ont préféré aller
au plus simple et écrire (...) pour la capture, ce qui force à écrire \( et
\) pour les protéger si on veut en faire des caractères normaux. Au contraire
dans les premières regex, pour garder la compatibilité avec l'existant on a
gardé ( et ) pour les caractères normaux et il a fallu écrire \(...\) pour
en faire des parenthèses capturantes.

Lorsque tout le monde sera passé au meilleur standard possible, à savoir PCRE
qui est devenu la norme dans tous les nouveaux langages, on ne se posera plus
de question. C'est un problème récurrent, comme les différents charsets
nationaux (CP850, CP1252, ISO-8859-1, ISO-8859-15, Shift-JIS, etc.) qui sont
de plus en plus souvent remplacés par UTF-8.

>>> Attention, selon ton type de regex il faudra peut-être écrire \( et \) à
>>> la place de ( et ), ou (inclusif) écrire $1 au lieu de \1.
> 
> Quand je comprends ce que je fais, j´échappe les caractères "spéciaux".
> 
>> N'étant pas de type PCRE, il y a différentes « saveurs » de regex, d'où les
>> différences possibles.
> 
> C'est un monde étrange ces regex...

cf. supra.

>>> 2e solution avec assertions
>>> ===========================
>>> 
>>> Remplacer :
>>> /(?<=^[^:][^ ]*?) .*/
>>> par rien.
> 
> !?
> 
>> Cette 2de solution est pour les regex de type PCRE.
> 
> Je vais regarder la solution de Jo Engo si elle fonctionne.

Oui, elle fonctionne parfaitement si tu dois transformer un fichier depuis un
shell plutôt que de faire la manip dans un programme en C/PHP/Python/whatever.

Il se trouve simplement qu'elle enchaîne deux regex au lieu d'une, comme je
l'ai expliqué dans ma réponse à son article. Vu que tu n'avais pas dit dans
quel contexte tu voulais utiliser une (ou plusieurs) regex, c'est pour ça que
j'ai donné plusieurs solutions.

-- 
Olivier Miakinen

[toc] | [prev] | [standalone]


Back to top | Article view | fr.comp.lang.regexp


csiph-web