Як я можу додати рядок до кінця кожного рядка у 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.