Як я можу додати рядок до кінця кожного рядка у Vim?


256

Я хочу додати *до кінця кожного рядка у Vim.

Я спробував код невдало

:%s/\n/*\n/g

Ваш не працює , тому що на правій стороні :s///, \nвідповідає нульовому символу. Розділ :help sub-replace-specialактуальний.
подвійнеDown

Відповіді:


354

:%s/$/\*/g

повинен працювати. Так слід, :%s/$/*/gяк містер Уігглз правильно вказує.


Чи є спосіб вставити " " в один і той же стовпець, оскільки всі рядки не мають однакової довжини, тож у рядку 1 може бути " " у 15-му стовпці, але у другому рядку 2 є "*".
Аман Джайн

11
є лише 1 EOL на рядок, тому gпрапор непотрібний.
подвійнеDown

Я хотів додати / до початку кожного рядка: 1, $ s / ^ / \ / g працював на мене.
farooqsadiq

@dirkgently Як я можу передати рядкову змінну як аргумент цій команді (знаєте, замість *)?
Матей Ротта

353

Навіть коротше, ніж команда: search:

:%norm A*

Ось що це означає:

 %       = for every line
 norm    = type the following commands
 A*      = append '*' to the end of current line

28
Людина, не існує ні vi, ні vim нитки, з якої я чогось не вчуся. Сьогодні я дізнаюся про норму. І, як кажуть на ура, "Норма!"
smcameron

4
Для попереднього вибору просто використовуйте 0i *, 0 приведе вас до початку рядка, i для режиму вставки, і * для *. Д:
Роб

7
Як VimGolfer, я не можу не допомогти, але додам, що використання, I*а не 0i*допоможе вам врятувати один натискання клавіші.
Єдідія Херт

24
Ще одна порада: це працює і для діапазонів. Просто виділіть рядки у візуальному режимі та натисніть :, це попередньо заповнить команду, в :'<,'>яку ви можете потім ввести:'<,'>norm A*
Jedidiah Hurt

8
Для попереднього приготування використовуйте Iзамість цього -:%norm I*
Just Lucky Really

42

Також:

:g/$/norm A*

Також:

gg<Ctrl-v>G$A*<Esc>

А-а-а ... Другий можна використовувати і з підбором ліній. Приємно!
Тім Флетчер

Не могли б ви пояснити перший приклад?
опитування Коді

@CodyPoll g- це globalкоманда, яка робить щось із кожним відповідним рядком. $відповідає кожному рядку. Це може бути також ^або .*. norma виконує команди, які ви зазвичай використовуєте в командному режимі. Значить, A*додавати *до кінця рядка.
дефл

41

Я думаю, що використання режиму візуального блоку є кращим і універсальнішим способом поводження з цим типом речей. Ось приклад:

This is the First line.  
This is the second.  
The third.

Щоб вставити "Привіт, світ". (пробіл + буфер обміну) в кінці кожного з цих рядків:

  • Для символу в першому рядку натисніть Ctrl-V (або Ctrl-Q, якщо Ctrl-V вставте).
  • Натисніть jj, щоб розширити візуальний блок на три лінії.
  • Натисніть $, щоб розширити візуальний блок до кінця кожного рядка. Натисніть A, тоді клавішу пробілу, а потім введіть Hello world. + потім Esc.

Результат:

This is the First line. Hello world.  
This is the second. Hello world.  
The third. Hello world.  

(приклад від Vim.Wikia.com )


3
Замість натискання клавіші jjможна натиснути, Gщоб перейти до останнього рядка. Це корисно у великих файлах, де натискання, jпоки ви не натиснете на останній рядок, не є практичним.
наш

Погодьтеся, що зоровий блок тут найчистіший, також розширюваний
Пітер Долан

Зверніть увагу, що спочатку це не здається, що він працює над усіма рядками, але після натискання клавіші Esc це проходить і додає їх усім.
Ноумен

Візуальний блок викликає проблеми та помилки при використанні vim як розширення для інших речей, наприклад VS Code. У таких випадках надійний варіант пошуку та заміни оригінального користувача.
Бреттінс

переконайтеся, що ви користуєтесь великим капіталом A, малий "а" не працює.
Джефф Хой

14

Якщо ви хочете додати Hello world в кінці кожного рядка:

:%s/$/HelloWorld/

Якщо ви хочете зробити це для певної кількості рядків, скажімо, від 20 до 30:

:20,30s/$/HelloWorld/

Якщо ви хочете зробити це на початку кожного рядка, тоді використовуйте:

:20,30s/^/HelloWorld/

6

Вам не дуже потрібен gкінець. Так стає:

:%s/$/*

Або якщо ви просто хочете *в кінці, скажіть рядки 14-18:

:14,18s/$/*

або

:14,18norm A*


5

Один варіант:

:g/$/s//*

Це знайде якір кінця рядка і замінить його *. Я кажу "замінник", але насправді це більше додаток, оскільки якір - це особлива річ, а не регулярний характер. Для отримання додаткової інформації див. Потужність g - Приклади .


Що значить s // в регексе? Я знаю подібну команду: g / / / p, (grep). Я майже впевнений, що ваша команда близька до моєї, принаймні в структурі.
Лео Леопольд Герц 준영

1
S є замінником - він замінює кінець якірного рядка на зірочку (ну, насправді не замінює його, оскільки це точка прив’язки).
paxdiablo

3
:% s / \ n / * \ r / g

Ваш перший варіант правильний деінде, але Vim чомусь повинен мати інший режим обробки нового рядка.


У моїй версії Vim \ n працює, але це просто замінює нову лінію на *, ефективно приєднуючись до рядків.
Натан Фелман

1
Ця команда перевірена, щоб справно працювати на кожній версії Vim, яку я пробував. Ви використовуєте версію Windows чи щось таке?

1
%s/\s*$/\*/g

це зробить трюк та забезпечить ігнорування провідних пробілів.

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