Réponses:
La commande: g de Vim est conçue pour exactement ce genre de tâche; exécuter une seule action sur chaque ligne qui correspond à un modèle particulier. Voici ma réponse:
:g/.\n\n\@!/norm o
Le motif que j'utilise est /.\n\n\@!/
. Décomposant cela en ses composants:
.
Correspond à n'importe quel caractère de la ligne. (utilisé pour éliminer immédiatement toutes les lignes vides existantes)\n
Correspond à un seul \ n à la fin du caractère ci-dessus\n\@!
Échoue la correspondance s'il y en a un autre \ n immédiatement après le \ n précédent.(Vérifiez :h E59
pour plus d'informations sur \@!
les spécificateurs de correspondance similaires dans les expressions régulières - il y en a quelques autres aussi!)
Ainsi, l'expression régulière de la commande: g a maintenant sélectionné chaque ligne non vide qui se termine par une seule nouvelle ligne et qui n'est pas suivie d'une ligne vide.
Après le modèle dans une :g
instruction vient la commande à exécuter sur les lignes correspondantes. Dans ce cas, je lui ai dit d'exécuter une commande en mode normal (en abrégé norm
), et la commande à exécuter est simplement o
, ce qui insère une ligne vide sous la ligne actuelle.
Ainsi prise ensemble, la commande trouve chaque ligne qui n'a pas de ligne vide en dessous et en ajoute une. Et c'est tout ce qu'il y a à faire! Vous voudrez peut-être consulter l' article Power of G du wiki vim pour plus de choses fantaisistes avec lesquelles vous pouvez faire :g
(et c'est la sœur négative :v
) qui ne l'ont pas.
:%s/$/
, puis appuyez ^V
, puis appuyez sur Enter
.
:%s/$/<C-V><CR><CR>
(pour utiliser le codage vim-folk commun des touches), cette approche ajoute simplement une nouvelle ligne après chaque ligne. Autrement dit, les lignes qui sont déjà séparées par des blancs (voir Ligne 3 -> Ligne 4, dans le texte d'exemple) finissent par obtenir des lignes vierges supplémentaires. La question d'origine était d'éviter d'ajouter des lignes vierges supplémentaires là où elles existaient déjà dans le texte de départ.
Lorsque j'ai testé la réponse globale de recherche et de remplacement de @ NeilForester, j'ai constaté qu'il manquait chaque remplacement prévu sur deux lignes consécutives non vides si les lignes n'avaient qu'un seul caractère dans chacune. Cela semble être dû au fait que le motif commence à correspondre à chaque occasion après le dernier caractère correspondant à l'occasion précédente.
L'utilisation de lookbehind et lookahead résout ce problème et raccourcit également l'expression régulière:
:%s/\n\@<!\n\n\@!/\r\r/g
\n\@<!\n
signifie que tout saut de ligne qui n'est pas juste après un autre saut de ligne est-ce correct? Mais je ne pouvais pas comprendre ce que cela \n\@!
signifie. J'aimerais le comprendre pour que je puisse l'apprendre et l'appliquer à d'autres modèles de recherche :)
\n\@<!\n
signifie tout saut de ligne qui ne suit pas immédiatement un autre saut de ligne. \n\@!
correspond à une largeur nulle si l'atome précédent (c'est-à-dire \n
) ne correspond pas juste avant ce qui suit. Essayez :help \@<!
de voir la documentation à ce sujet dans vim. I
Autrement:
%s/\(.\)\n\(.\)/\1\r\r\2/
Ce qui signifie,
\(.\) match and capture a non-newline character,
\n match a newline
\(.\) match and capture a non-newline character
remplacer par: première capture, double retour à la ligne et deuxième capture.
Par exemple, les line1\nLine2
résultats dans \1 = 1
et \2 = L
.
Corrigez-moi si je me trompe. Je crois que vous utilisez la lettre k en mode commande pour descendre d'une ligne. Entrez ensuite en mode insertion et ajoutez la ligne suivante. Répéter au besoin? J'espère que cela t'aides!
k
monte d'une ligne. j
descend d'une ligne.
/[^\n]\n[^\n]
:map <F2> no<esc><F2>
Appuyez ensuite sur <F2>
. Cela recherchera deux lignes non vides consécutives, puis ajoutera une ligne entre elles, à plusieurs reprises.
Éditer:
Voici une autre façon de procéder avec une seule recherche globale et un remplacement:
:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g
Essayez cette commande ( 16
caractères):
:%!sed G|cat -s
:%norm o
mais il s'avère que cela ne fonctionne pas comme prévu dans le cas deo
. 1