Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1171 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Logiciels

  gvim Expression réguliére Eof

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

gvim Expression réguliére Eof

n°929032
phdenis
Posté le 01-07-2007 à 17:22:29  profilanswer
 

Bonjour,
 
Je suis à la recherche d'une expression réguliére permettant de supprimer toutes les lignes blanches à la fin d'un fichier.
 
Exemple:

Code :
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.   unsigned int X = 5;
  5.   unsigned int Y = 10;
  6.   printf("Ceci est un exemple bidon\n" );
  7.   printf("X %d Y %d\n" );
  8.   return 0:
  9. }
  10. /* -- Fin de fichier -- */
  11. ligne blanche1
  12. ligne blanche2
  13. ligne blanche3
  14. ligne blanche4


 
C'est à dire supprimer la ligne 15,16,17,18. (que j'ai noté ligne blanche de façon à ceux qu'elles apparaissent).  :)  
Dans mon gvim, j'avais pensé à une expression réguliére du genre :

Code :
  1. :%s/\(.*\)\n\(^$*\)\n\x26/\1\n/


 
Ou le \x26 represente le EOF (d'aprés la table ASCII) mais sans succès.
D'ailleurs, je me demande si il est possible de voir le caractére EOF  :??:  
 
Merci pour votre aide.

mood
Publicité
Posté le 01-07-2007 à 17:22:29  profilanswer
 

n°929035
Fork Bomb
Obsédé textuel
Posté le 01-07-2007 à 17:31:03  profilanswer
 

Hummm...
Peut-être qu'on doit considérer comme une "ligne blanche" le fait que \n apparaisse plus d'une fois..
 
Non ?


---------------
Décentralisons Internet-Bépo-Troll Bingo - "Pour adoucir le mélange, pressez trois quartiers d’orange !"
n°929043
phdenis
Posté le 01-07-2007 à 18:35:33  profilanswer
 

Fork Bomb a écrit :

Hummm...
Peut-être qu'on doit considérer comme une "ligne blanche" le fait que \n apparaisse plus d'une fois..
 
Non ?


 
En fait, je veux supprimer seulement les lignes blanches qui sont apres la derniére ligne contenant des caractéres ... si avant, on a des caractéres, ca doit pas les modifier ...
 

Code :
  1. :14,$s/\(.*\)\(^\n$*\)/\1\n/


 
Je viens de trouver une expression réguliére qui me parait correct. Mais mon probléme c'est de determiner le dernier numéro de ligne (ici la ligne 14) qui contient un caractére et aprés j'applique l'expression régulière..
 
T'en penses quoi ?

n°929049
Fork Bomb
Obsédé textuel
Posté le 01-07-2007 à 19:20:45  profilanswer
 

phdenis a écrit :

T'en penses quoi ?


 
Rien, je suis nul en prog'.
Je pensais juste que plus d'un \n a la suite permettait de repérer les lignes vides.
Ma reflection s'arrête là. Désolé.


---------------
Décentralisons Internet-Bépo-Troll Bingo - "Pour adoucir le mélange, pressez trois quartiers d’orange !"
n°929064
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 01-07-2007 à 21:51:43  profilanswer
 

Tu veux forcément du vim pur ou on peut utiliser des outils shell (avec :!cmd ou autre) ?
 
avec sed :
virer les lignes du début :  

sed '/./,$!d' file


virer les lignes de la fin :  

sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file


Message édité par Xavier_OM le 03-07-2007 à 11:43:17

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°929083
phdenis
Posté le 01-07-2007 à 23:51:24  profilanswer
 

Re,
 
Je veux mettre la commande dans mon .vimrc de facon à l'éxécuter dès que je fais un enregistrement d'un fichier *.c,*.h et *.mk
Si on peut le faire avec une commande de type sed, on doit pouvoir le faire dans gvim aussi.
 
Non, qu'en penses-tu ?
 

Message cité 1 fois
Message édité par phdenis le 01-07-2007 à 23:52:27
n°929165
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 02-07-2007 à 10:02:00  profilanswer
 

phdenis a écrit :

Re,
 
Je veux mettre la commande dans mon .vimrc de facon à l'éxécuter dès que je fais un enregistrement d'un fichier *.c,*.h et *.mk
Si on peut le faire avec une commande de type sed, on doit pouvoir le faire dans gvim aussi.
 
Non, qu'en penses-tu ?


 
Oui c'est tout à fait possible en te faisant une petite fonction en vim script  :hello:


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
n°929494
phdenis
Posté le 02-07-2007 à 20:29:04  profilanswer
 

Re,
 
En essayant d'analyser l'expression du sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file
 
J'avoue ne pas tout avoir compris ...
Le sed -e :a correspond à une etiquette
et aprés -e '/^\n*$/{$d;N;};/\n$/ba'  
-> ^\n*$ -> toutes les lignes vides ...
->{$d;N;} apparement c'est la que ca bloque ... Tu comprends cette partie ?  
J'ai compris que l'on remplace toutes les lignes vides par un seul retour à la ligne à partir de l'étiquette ba ..
 
Non, si tu as des indices je suis preneur ?

Message cité 1 fois
Message édité par phdenis le 02-07-2007 à 20:29:26
n°929556
Xavier_OM
Monarchiste régicide (fr quoi)
Posté le 02-07-2007 à 22:07:30  profilanswer
 

phdenis a écrit :

Re,
 
En essayant d'analyser l'expression du sed -e :a -e '/^\n*$/{$d;N;};/\n$/ba' file
 
J'avoue ne pas tout avoir compris ...
Le sed -e :a correspond à une etiquette
et aprés -e '/^\n*$/{$d;N;};/\n$/ba'  
-> ^\n*$ -> toutes les lignes vides ...
->{$d;N;} apparement c'est la que ca bloque ... Tu comprends cette partie ?  
J'ai compris que l'on remplace toutes les lignes vides par un seul retour à la ligne à partir de l'étiquette ba ..
 
Non, si tu as des indices je suis preneur ?


 
Tu n'es pas loin ;) (un peu à côté :D)
 
Déjà un bon truc pour pas se paumer avec sed, c'est de bosser avec des lignes numérotées, genre  

yes | head -10 | cat -n  | sed blablabla


 
 
Pour comprendre $d, regarde ce que fait :

yes | head -10 | cat -n  | sed '6,$ d'


 
Pour N, il faut comprendre comment marche sed. En gros :
- sed prend une ligne du fichier en entrée, et la copie dans le "pattern space"
- on applique la première commande sed sur le pattern space
- on applique la seconde commande sed sur le pattern space
- etc etc
- quand on a appliqué tout, on copie le pattern space (qu'on a bien modifié :D) vers stdout
- on lit la ligne suivante
Test un petit :

yes | head -10 | cat -n | sed -e '/8/{N;/9/d}'


 
Ca devrait aller mieux...
 
edit :  
Par contre pour vim on s'en fout hein, à priori tu te fais une fonction qui va à la fin du fichier et qui delete tant que c'est vide, et ca devrait marcher tout seul ;).  
Un truc genre :
 
aller à la fin du fichier, fin de la dernière ligne :

G$


 
rechercher (à contresens) une ligne non-vide :

?.


Bon ce . est très limite, libre à toi de mettre une regexp plus poussée.
- si tu veux virer les lignes non-vides mais contenant juste des espaces/tabulations . sera trop tolérant pour toi
- si tu es au début d'une ligne non-vide, ?. ira matcher la fin de la ligne précédente (c'est pour ca que je commence par G$ et pas seulement G)
 
effacer les lignes blanches entre ici et la fin du fichier :

:,$g/^\s$/d


Message édité par Xavier_OM le 03-07-2007 à 11:43:54

---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Logiciels

  gvim Expression réguliére Eof

 

Sujets relatifs
Gvim et le langage C[Systeme liste diffusion SYMPA] Expression régulière + form
squid guard interdire des expression mais pas sur certain sites[Résolu] Expression rationnelle : modifier une chaîne
protection d'expression régulière / shell / grepexpression régulière shell
[Résolu] ls avec expression régulière 
Plus de sujets relatifs à : gvim Expression réguliére Eof


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR