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?
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?
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 \r
est une nouvelle ligne, voir :help :substitute
et :help regexp
pour 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 hlsearch
activé 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
\r
, voyez-vous:help s/\r
. Il pourrait être remplacé par un typage de nouvelle ligne littéral<c-v><cr>
. Dans ce contexte\n
est un caractère nul, voir:help s/\n
.replaces the content of the register
- quel registre?Utiliser
vim
la 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: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:
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
q
macro 4 fois résultant en: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.
la source
9001
touche sur votre clavier pour taper rapidement votre nom d'utilisateur.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
gq
avec un mouvement.Par exemple,
gql
divisera 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ùn
est le nombre de caractères que vous souhaitez dans une ligne, par exemple,10
et 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.
la source