Comment diviser une ligne en plusieurs lignes efficacement?

11

J'ai reçu des données enregistrées dans un fichier texte qui n'est qu'une longue ligne avec chaque valeur séparée par un espace. Existe-t-il une commande ou un ensemble de commandes qui divisera une ligne en plusieurs lignes?

Dom
la source

Réponses:

21

Vous pouvez simplement remplacer n'importe quel espace consécutif sur la ligne par une nouvelle ligne en utilisant la commande :s/\s\+/\r/g. \s\+signifie un ou plusieurs espaces, et \rest une nouvelle ligne, voir :help :substituteet :help regexppour plus de détails. Si vous exécutez la commande sur une ligne comme:

foo bar baz

Vous obtenez:

foo
bar
baz

Si vous avez hlsearchactivé et que vous ne voulez pas encombrer votre écran avec des espaces en surbrillance partout, vous pouvez écrire une petite fonction comme la suivante pour l'éviter:

function! SplitLineNicely()
    " Save previous value of last search register
    let saved_last_search_pattern = @/

    " :substitute replaces the content of the search register with the `\s\+` 
    " pattern highlighting all whitespaces in the file
    substitute /\s\+/\r/g

    " Restore previous search register
    let @/ = saved_last_search_pattern
endfunction
toro2k
la source
"Si vous ne voulez pas encombrer votre écran avec des espaces en surbrillance partout" cela suppose trop de choses sur la configuration de l'OP.
romainl
@romainl Mieux?
toro2k
1
Oui, c'est mieux IMO.
romainl
2
C'est \r, voyez-vous :help s/\r. Il pourrait être remplacé par un typage de nouvelle ligne littéral <c-v><cr>. Dans ce contexte \nest un caractère nul, voir :help s/\n.
toro2k
1
replaces the content of the register- quel registre?
stillanoob
5

Utiliser vimla substitution de est probablement l'un des meilleurs moyens d'accomplir votre tâche, mais vous pouvez également utiliser une macro. Supposons que nous ayons les données suivantes, avec le curseur quelque part sur la ligne 1:

1 a b c d e f
~

En commençant en mode normal, frapper qqcommencera à enregistrer une macro appelable via @q. Tout ce qqqui sera tapé après sera reproductible via l'appel susmentionné. Notre objectif est d'enregistrer des commandes normales qui seront suffisamment générales pour permettre une répétition transparente.

Ainsi, nous pouvons taper 0pour amener le curseur au début de la ligne, puis fspacepour déplacer le curseur dans le premier espace. Cela nous permet ensuite de taper renter, résultant en:

1 a
2 b c d e f
~

Frapper qmaintenant est une bonne idée car notre macro réutilisable est prête pour la répétition. Quelque peu arbitrairement, nous notons qu'il reste 4 espaces à remplacer par des retours à la ligne. Ainsi en appuyant sur,, 4@qnous répétons la qmacro 4 fois résultant en:

1 a
2 b
3 c
4 d
5 e
6 f
~

Notez qu'en raison de la façon dont nous avons créé la macro, il aurait été sûr de répéter la commande plus de 9000 fois, car elle ne concernerait que la ligne actuelle, et comme il n'y avait pas d' espace à droite de la dernière entrée de données, fspacevolonté échouent «gentiment», empêchant les données d'être remplacées par des sauts de ligne.

Donc, pour répéter depuis le début:

qq0fspacerenterq9001@q

fournit notre résultat.

HAL 9001
la source
1
J'adore le fait que vous ayez une 9001touche sur votre clavier pour taper rapidement votre nom d'utilisateur.
Rich
4

Le moyen le plus simple que j'ai trouvé pour séparer les lignes dans Vim est la commande en mode normal gq(tapez les deux lettres en succession rapide en mode normal ou visuel).

En mode visuel, il divisera tout ce qui est sélectionné, en mode normal, vous suivez gqavec un mouvement.

Par exemple, gqldivisera une ligne à la largeur actuellement définie. Pour définir la largeur des lignes de séparation pour être différente de votre paramètre actuel, vous pouvez utiliser :set textwidth=n, où nest le nombre de caractères que vous souhaitez dans une ligne, par exemple, 10et revenir à votre largeur normale lorsque vous avez terminé.

J'ai obtenu ces informations d'une vidéo Youtube de Kholidfu qui montre comment joindre et diviser des lignes en mode normal en utilisant un mouvement.

vdicarlo
la source