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


257

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

Я попытался код неудачно

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

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

Ответы:


355

:%s/$/\*/g

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


Есть ли способ вставить « » в один и тот же столбец, поскольку все строки имеют разную длину, поэтому строка 1 может иметь « » в 15-м столбце, а строка 2 - «*» в 25-м столбце.
Аман Джайн

11
в строке только 1 EOL, поэтому gфлаг не нужен.
Двойной Вниз

Я хотел добавить / в начало каждой строки: 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 для режима вставки и * для *. D:
Роб

7
Как VimGolfer я не могу не добавить, что использование, I*а не 0i*сэкономит вам одно нажатие клавиши.
Джедидия Харт

24
Еще один совет: это работает и для диапазонов. Просто выделите строки в визуальном режиме и нажмите :, это предварительно заполнит команду, с :'<,'>которой вы можете затем выполнить:'<,'>norm A*
Jedidiah Hurt

8
Для предварительного использования используйте Iвместо -:%norm I*
Просто повезло действительно

42

Также:

:g/$/norm A*

Также:

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

Аааа ... Второй тоже можно использовать с выбором строк. Ницца!
Тим Флетчер

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

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

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 он проходит и добавляет его ко всем.
Ноумен

Visual Block вызывает проблемы и ошибки при использовании vim в качестве расширения для других целей, таких как VS Code. В этих случаях поиск и замена исходного запрашиваемого пользователя является надежным вариантом.
Бреттинс

убедитесь, что вы используете заглавную букву А, строчная буква "а" не работает.
Джефф Хой

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//*

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


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

1
S является заменой - он заменяет привязку конца строки звездочкой (ну, фактически, не заменяет ее, так как это точка привязки).
paxdiablo

3
:% S / \ п / * \ г / г

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


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

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

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

это поможет, и ведущие пробелы будут проигнорированы.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.