Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[HS] sed : garder le motif

19 réponses
Avatar
steve
Bonjour et pardon pour ce HS.

J'ai un long fichier de la forme

ABC(du texte)
MSD(un autre texte)
etc...


J'aimerai traiter ce fichier de tel manière qu'à la sortie je n'ai que
les 3 premiers caractères :

ABC
MSD
etc...


Sed devrait faire l'affaire non ?

J'ai essayé (entre autres)

sed -e 's/^[A-Z][A-Z][A-Z]//' input_file

et ça me sort (fort logiquement d'ailleurs) les caractères de rang 4 et
plus, donc exactement le contraire de ce que je veux.

Comment lui dire de ne m'afficher *que* le motif cherché ?

Merci d'avance,
Steve

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to debian-user-french-REQUEST@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmaster@lists.debian.org

9 réponses

1 2
Avatar
steve
> > M'aurais-je gouré ?
>
> Je re-cite :
>
>> Bonjour et pardon pour ce HS.
>>
>> J'ai un long fichier de la forme
>>
>> ABC(du texte)
>> MSD(un autre texte)
>> etc...
>>
>>
>> J'aimerai traiter ce fichier de tel manière qu'à la sortie je n'ai que
>> les 3 premiers caractères :
>>
>> ABC
>> MSD
>> etc...
>
>> </Troll>
>

<Troll>
En effet, il y a un doute possible !

Si on ne lit que le début, on pense en effet que l'auteur désire les 3
premiers caractères quelconques.

Si on lit la suite :
----------------------------
> J'ai essayé (entre autres)
>
> sed -e 's/^[A-Z][A-Z][A-Z]//' input_file
----------------------------
Ce qui prête à croire qu'il désirait seulement des [A-Z].



Ce que l'auteur confirme ;-)


Promis... demain j'arrête les trolls.



Accepté si ça recommence vendredi !

</Troll>



--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Pierre Meurisse
On Wed, Jan 28, 2009 at 08:55:48AM +0100, steve wrote:

> > sed -e 's/^[A-Z][A-Z][A-Z]//' input_file
> >
> > et ça me sort (fort logiquement d'ailleurs) les caractères de rang 4 et
> > plus, donc exactement le contraire de ce que je veux.
> >
> > Comment lui dire de ne m'afficher *que* le motif cherché ?
> >
> S'il s'agit bien d'un seul fichier, il y a une méthode simple en deux
> temps :
> - editer le fichier disons fich.txt avec vi et supprimer tout ce qui
> dépasse le troisième caractère (Ctrl-V).
> - grep -E "[A-Z][A-Z][A-Z]" fich.txt > fichmodif.txt

Je ne comprends la seconde étape (ni la première d'ailleurs, il faut le
faire manuellement ?) si la première fait le travail.



Je détaille :
- éditer le fichier avec vi et sélectionner en mode colonne tout ce qui
dépasse le troisième caractère en utilisant la commande Ctrl-V ;
il faudra éventuellement allonger la dernière ligne de manière à
pouvoir tout sélectionner d'un seul coup. Supprimer avec la commande d
puis sauvegarder.

Si le ficher d'origine était :

ABCqsd
DEFqsdf
qsddfqqsd
XYZ
FGHqdfq
tXY

il devient :

ABC
DEF
qsd
XYZ
FGH
tXY

Reste à éliminer les lignes contenant des minuscules:

grep -E "[A-Z][A-Z][A-Z]" fich.txt > fichmodif.txt

et on récupère le résultat dans fichmodif.txt.

ABC
DEF
XYZ
FGH

C'est bien cela que tu voulais ?

Naturellement, à la place de vi, on peut utiliser un autre éditeur de
textes qui accepte les sélections en colonne.

A+

--
Pierre Meurisse

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Jean-Luc Villoué
Allez, à mon tour ;)

2009/1/27 steve :
Bonjour et pardon pour ce HS.

J'ai un long fichier de la forme

ABC(du texte)
MSD(un autre texte)
etc...


J'aimerai traiter ce fichier de tel manière qu'à la sortie je n'ai qu e
les 3 premiers caractères :

ABC
MSD
etc...



on peut mixer les solutions de Gilles et de Pierre :
grep -E "^[A-Z][A-Z][A-Z]" fich.txt | cut -c 1-3 > fichmodif.txt

jluc

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
steve
> > > > sed -e 's/^[A-Z][A-Z][A-Z]//' input_file
> > >
> > > et ça me sort (fort logiquement d'ailleurs) les caractères de rang 4 et
> > > plus, donc exactement le contraire de ce que je veux.
> > >
> > > Comment lui dire de ne m'afficher *que* le motif cherché ?
> > >
> > S'il s'agit bien d'un seul fichier, il y a une méthode simple en deux
> > temps :
> > - editer le fichier disons fich.txt avec vi et supprimer tout ce qui
> > dépasse le troisième caractère (Ctrl-V).
> > - grep -E "[A-Z][A-Z][A-Z]" fich.txt > fichmodif.txt
>
> Je ne comprends la seconde étape (ni la première d'ailleurs, il faut le
> faire manuellement ?) si la première fait le travail.
>
Je détaille :



merci.

- éditer le fichier avec vi et sélectionner en mode colonne tout ce qui
dépasse le troisième caractère en utilisant la commande Ctrl-V ;



Je ne connaissais pas cette sélection en mode bloc, je vois mieux
maintenant de quoi il s'agit. Pour info, c'est bien v majuscule.

il faudra éventuellement allonger la dernière ligne de manière à
pouvoir tout sélectionner d'un seul coup. Supprimer avec la commande d
puis sauvegarder.



ok, c'est effectivement assez simple ainsi.

Si le ficher d'origine était :

ABCqsd
DEFqsdf
qsddfqqsd
XYZ
FGHqdfq
tXY

il devient :

ABC
DEF
qsd
XYZ
FGH
tXY



ok.

Reste à éliminer les lignes contenant des minuscules:



C'est cette seconde phase que je n'avais pas compris et pour cause, les
trois premières lettres sont toujours en majuscules.

grep -E "[A-Z][A-Z][A-Z]" fich.txt > fichmodif.txt



ok.

et on récupère le résultat dans fichmodif.txt.

ABC
DEF
XYZ
FGH

C'est bien cela que tu voulais ?



Absolument, merci d'ailleurs.

Naturellement, à la place de vi, on peut utiliser un autre éditeur de
textes qui accepte les sélections en colonne.



Ou encore éditer le fichier dans un tableur est utilisé une fonction
substr(), mais je ne voulais pas le faire comme ça, je voulais utiliser
sed.

Merci pour ton explication.

Excellente journée,
Steve

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
steve
> > Merci pour ton explication.
>
De rien.
Cela m'a permis de découvrir cut, que je n'ai pas l'habitude d'utiliser.
Il faut dire que le man de cut n'est pas des plus clairs :



J'avais aussi pensé à cut mais comme toi j'ai trouvé le man pour le
moins lacunaire, ce qui m'a finalement orienté vers sed.


-c, --characters=LIST
select only these characters

La solution de Jean-Luc est nettement meilleure :

> grep -E "^[A-Z][A-Z][A-Z]" fich.txt | cut -c 1-3 > fichmodif.txt



c'est quand même plus long que les solutions basées sur sed, m'enfin on
s'en tape de savoir qui a la plus courte hein ;-)


Merci à lui.



Oui merci Jean-Luc !

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Pierre Meurisse
>
Merci pour ton explication.



De rien.
Cela m'a permis de découvrir cut, que je n'ai pas l'habitude d'utiliser.
Il faut dire que le man de cut n'est pas des plus clairs :

-c, --characters=LIST
select only these characters

La solution de Jean-Luc est nettement meilleure :

grep -E "^[A-Z][A-Z][A-Z]" fich.txt | cut -c 1-3 > fichmodif.txt




Merci à lui.

Excellente journée.

--
Pierre Meurisse

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Jean-Luc Villoué
2009/1/28 steve :
c'est quand même plus long que les solutions basées sur sed,


j'ai encore du mal avec sed, mais promis, je vais m'y mettre ;)


Merci à lui.



Oui merci Jean-Luc !



de rien, après tout, je me suis contenté de reprendre des solutions
déjà dnnées...

jluc

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
steve
> > c'est quand même plus long que les solutions basées sur sed,
j'ai encore du mal avec sed, mais promis, je vais m'y mettre ;)



Moi aussi je me dis ça à chaque fois que j'en ai besoin ;
malheureusement c'est très rare ce qui fait que j'oublie les 3/4 de ce
que j'avais appris..

>
>>
>> Merci à lui.
>
> Oui merci Jean-Luc !

de rien, après tout, je me suis contenté de reprendre des solutions
déjà dnnées...



C'est vrai ça, tu n'es qu'un chapardeur de solutions ;-)

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
Avatar
Jacques L'helgoualc'h
steve a écrit, mercredi 28 janvier 2009, à 11:24 :
[...]
> > grep -E "^[A-Z][A-Z][A-Z]" fich.txt | cut -c 1-3 > fichmodif.txt

c'est quand même plus long que les solutions basées sur sed, m'enfin on
s'en tape de savoir qui a la plus courte hein ;-)



sed -nre '# quand la ligne commence bien,
/^[A-Z]{3}/{
# on insère une césure si besoin
s/./n/4
# et on écrit seulement la première partie
P
}'

Avec Awk, c'est peut-être plus lisible :

awk -F '' '/^[A-Z][A-Z][A-Z]/{print $1$2$3}'

Sed fournit la solution la plus légère, et qui marche même avant le
montage d'un /usr.

32K /usr/bin/cut
56K /bin/sed
104K /bin/grep
116K /usr/bin/mawk
336K /usr/bin/gawk

--
Jacques L'helgoualc'h

--
Lisez la FAQ de la liste avant de poser une question :
http://wiki.debian.org/DebFrFrenchLists
Vous pouvez aussi ajouter le mot ``spam'' dans vos champs "From" et
"Reply-To:"

To UNSUBSCRIBE, email to
with a subject of "unsubscribe". Trouble? Contact
1 2