Як ефективно розділити лінію на кілька ліній?


11

Я отримував записані дані в текстовому файлі, який є лише одним довгим рядком, кожне значення якого розділено пробілом. Чи є команда чи набір команд, які розділять один рядок на кілька рядків?

Відповіді:


21

Ви можете просто замінити будь-який послідовний пробіл у рядку новим рядком за допомогою команди :s/\s\+/\r/g. \s\+середній один або кілька символів пробілів, і \rце символ нового рядка см :help :substituteі :help regexpдля деталей. Якщо ви запускаєте команду в такому рядку, як:

foo bar baz

Ви отримуєте:

foo
bar
baz

Якщо ви hlsearchввімкнули і не хочете захаращувати екран скрізь виділеними пробілами, ви можете написати таку функцію, як наступна, щоб уникнути цього:

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

"Якщо ви не хочете захаращувати екран скрізь виділеними пробілами", це передбачає занадто багато про налаштування ОП.
romainl

@romainl Краще?
toro2k

1
Так, краще ІМО.
romainl

2
Це \r, див :help s/\r. Це може бути замінено буквальним набором нового рядка <c-v><cr>. У цьому контексті \nнульовий символ, див :help s/\n.
toro2k

1
replaces the content of the register- який реєстр?
stilanoob

5

Використання vimзаміни 's, мабуть, є одним з кращих способів виконання поставленого завдання, але ви також можете використовувати макрос. Припустимо, у нас є такі дані, з курсором десь у рядку 1:

1 a b c d e f
~

Починаючи у звичайному режимі, натискання qqпочне записувати макрос, який можна викликати через @q. Все, що набрано після qqцього, буде повторюватися за допомогою вищезгаданого дзвінка. Наша мета - записати звичайні команди, які будуть загальними для забезпечення безперебійного повторення.

Таким чином, ми можемо набрати 0курсор до початку рядка, а потім fspaceперемістити курсор у перший пробіл. Це дозволяє нам потім набрати renter, в результаті чого:

1 a
2 b c d e f
~

Удар qзараз - це гарна ідея, оскільки наш макрос для багаторазового використання готовий до повторення. Дещо довільно зазначимо, що для заміни новими рядками залишилось 4 пробіли. Таким чином, натискаючи, 4@qми повторюємо qмакрос 4 рази, в результаті чого:

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

Зверніть увагу , що з - за того , як ми створили макрос, він був би в безпеці , щоб повторити команду більше 9000 разів, як це буде впливати тільки на поточний рядок, і так як не було ніяких прогалин праворуч від останнього запису даних, fspaceбуде "красиво" не вдається, не даючи замінити дані новими рядками.

Тож повторимо з початку:

qq0fspacerenterq9001@q

забезпечує наш результат.


1
Мені подобається, що у вас 9001на клавіатурі є клавіша для швидкого введення вашого імені користувача.
Багатий

5

Найпростіший спосіб, який я знайшов для розділення рядків у Vim, - це команда звичайного режиму gq(введіть обидві літери швидкою послідовністю у звичайному чи візуальному режимі).

У візуальному режимі він розділяє все, що вибрано, у звичайному режимі ви рухаєтесь gqрухом.

Наприклад, gqlрозділить один рядок на задану в даний час ширину. Для того, щоб встановити ширину розщеплених ліній буде відрізнятися від поточної настройки, ви можете використовувати :set textwidth=n, де nце кількість символів , які ви хочете в рядку, наприклад, 10і зміна назад до нормальної ширини , коли ви закінчите.

Отримав цю інформацію з Youtube- відео від Холідфу, який показує, як з'єднати та розділити лінії в звичайному режимі за допомогою руху.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.