gvim Expression réguliére Eof

gvim Expression réguliére Eof - Logiciels - Linux et OS Alternatifs

Marsh Posté le 01-07-2007 à 17:22:29    

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.

Reply

Marsh Posté le 01-07-2007 à 17:22:29   

Reply

Marsh Posté le 01-07-2007 à 17:31:03    

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 !"
Reply

Marsh Posté le 01-07-2007 à 18:35:33    

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 ?

Reply

Marsh Posté le 01-07-2007 à 19:20:45    

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 !"
Reply

Marsh Posté le 01-07-2007 à 21:51:43    

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.
Reply

Marsh Posté le 01-07-2007 à 23:51:24    

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
Reply

Marsh Posté le 02-07-2007 à 10:02:00    

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.
Reply

Marsh Posté le 02-07-2007 à 20:29:04    

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
Reply

Marsh Posté le 02-07-2007 à 22:07:30    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed