2009-02-27 8 views
192

Я хочу добавить * в конец каждой строки в Vim.Как добавить строку в конец каждой строки в Vim?

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

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

Ваш не работает, поскольку в правой части ': s ///', '\ n' соответствует нулевой символ. Раздел ': help sub-replace-special' имеет значение. – doubleDown

ответ

275

:%s/$/\*/g

должен работать. Так должно :%s/$/*/g как MrWiggles указывает правильно.

+9

+1. Нет необходимости скрывать звездочку в замене tho – tddmonkey

+3

Yup. Более читабельна для меня одним. – dirkgently

+2

Я не буду спорить, у вас есть удивительное имя пользователя, чтобы получить вам очки kudos ;-) – tddmonkey

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

это будет делать трюк и обеспечить, чтобы ведущие пробелы игнорировались.

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

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

+0

В моей версии Vim \ n работает, но это просто заменяет новую строку символом *, эффективно соединяя строки. –

+1

Эта команда проверена, чтобы нормально работать в каждой версии Vim, которую я пробовал. Вы используете версию Windows или что-то еще? – flussence

4

Один из вариантов:

:g/$/s//*

Найдет каждый конец линии якоря и заменить его *. Я говорю «подставить», но на самом деле это скорее добавление, поскольку якорь - это особая вещь, а не обычный персонаж. Для получения дополнительной информации см. Power of g - Examples.

+0

Что означает s // в регулярном выражении? Я знаю аналогичную команду: g///p, (grep). Я почти уверен, что ваша команда близка к моей, по крайней мере, в структуре. –

+0

эля является заменой - это заменить конец якоря звездочки (ну, на самом деле не заменяет его, так как это узловая точка). – paxdiablo

35

также:

:g/$/norm A* 

также:

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

Ahhh ... Второй может использоваться с выбором линий. Ницца! –

+0

Не могли бы вы объяснить первый пример? –

+0

@CodyPoll 'g' - команда' global', которая делает что-то с каждой соответствующей строкой. '$' соответствует каждой строке. Это может быть также '^' или '. *'. norm выполняет команды, которые вы обычно используете в командном режиме. Поэтому 'A *' означает добавить '*' в конец строки. – defhlt

277

Даже короче: команды поиска:

:%norm A* 

Это то, что это означает:

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

Человек, не существует ни vi, ни vim нити, из которых я ничего не узнаю. Сегодня я узнаю о норме. И, как говорится в «Привет», «Норма!» – smcameron

+4

Для добавления, вы просто используете 0i *, 0 приведет вас к началу строки, i для режима вставки и * для *. D: – Rob

+6

Как [VimGolfer] (http://vimgolf.com) Я не могу не добавить, что использование 'I *', а не '0i *' спасет вас одним нажатием клавиши. –

5

... и предварять (добавить начало) каждую строку *,

%s/^/*/g 
+0

Это не отвечает на вопрос , – doubleDown

5

Вы действительно не нужны g в конце. Таким образом, становится:

:%s/$/* 

Или если вы просто хотите * в конце, говорят строки 14-18:

:14,18s/$/* 

или

:14,18norm A* 
20

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

Это первая строка.
Это второй.
Третий.

Вставить "Hello world."(Пробел + буфер) в конце каждой из этих линий:

  • На персонажа в первой строке, нажмите Ctrl-V (или Ctrl-Q, если Ctrl-V, это паста)
  • . Нажмите JJ, чтобы расширить визуальный блок на трех линиях.
  • Нажмите $, чтобы расширить визуальный блок в конце каждой строки. Нажмите кнопку A то пространство, то тип Привет мир. + затем Esc.

Результат это:

Это первая строка. Привет мир.
Это второй. Привет мир.
Третий. Привет мир.

(пример из http://vim.wikia.com/wiki/Inserting_text_in_multiple_lines)

+1

Вместо нажатия 'jj' можно нажать' G', чтобы перейти к последней строке. Это полезно в больших файлах, где нажатие 'j', пока вы не нажмете последнюю строку, нецелесообразно. – nash

7

Если и хотите добавить Привет мир в конце каждой строки:

:%s/$/HelloWorld/ 

Если вы хотите сделать это для определенного числа линии говорят, от 20 до 30 использование:

:20,30s/$/HelloWorld/ 

Если и хотите сделать это в начале каждой строки используйте:

:20,30s/^/HelloWorld/