2010-11-25 40 views
2

Dans vim, comment puis-je utiliser la logique suivante sur mon fichier:Comment effectuer la concaténation de lignes en fonction d'une condition dans vim?

Si la ligne n ne pas se terminer par un point-virgule, les lignes concaténer n et n + 1.

J'ai des fichiers qui ont cassé les instructions SQL:

Version cassée

select * from tab1; 
select col4, col5 from 
tab5; 
insert into 
tab6 values(
2, 4); 

version requise

select * from tab1; 
select col4, col5 from tab5; 
insert into tab6 values(2, 4); 

Répondre

4
:v/;$/normal J 

Vous pourriez avoir à exécuter plusieurs fois.

EDIT: Voici une solution qui permet de résoudre les lignes divisées sur plusieurs (> 2) lignes:

%s/^\s*$\|\([^;]\)\s*\n/\1/g 

Remarque: Les lignes vides sont conservés, mais parés, grâce au^\ s *

$
+0

merci, mais ce 'plusieurs' courrait en 1000s pour moi. Y a-t-il un moyen d'automatiser cela? – Lazer

+0

C'est ce que je cherchais. : g n'est pas la solution. Je modifie mon message. –

1

Shameless « sale » « hack » ;-)

:1,$ join 

cette jointure chaque ligne sur le fichier à un seul, mais vous pouvez régler la plage ...

:s:;:&\r:g 

cela remplace chaque; avec un ; et une nouvelle ligne

HTH