сегодня я начал использовать vim. Я запутался в командах :g
и :%s
. Итак, в чем разница между командами :g
или :%s
?
В чем разница между: g и:% s командами в vim
Ответ 1
:g
выполняет команду для всех строк, которые соответствуют регулярному выражению:
:g/LinesThatMatchThisRegex/ExecuteThisCommand
Пример:
:g/hello/d
Это приведет к удалению (d
) всех строк, содержащих hello.
С другой стороны, :%s
просто выполняет поиск (по регулярному выражению) и заменяет его по всему файлу:
:%s/hello/world/g
(g
означает глобальный, поэтому он заменит все из них, а не только на одну строку, вы также можете использовать флаг c
(:%s/hello/world/gc
), если вы хотите подтвердить каждую замену вручную).
Это заменяет все вхождения hello
на world
.
Команды :g
и :%s
поддерживают регулярные выражения.
Команда s
означает substitute
, а символ %
- во всем буфере. Таким образом, %s
означает замену во всем буфере. Вы также можете задать диапазон строк:
:10,15s/hello/world/g
Это выполнит поиск и замену, замеченные ранее только в строках с 10 по 15 (включительно).
Ответ 2
Они разные.
:g
может выполнять команды для сопоставленных строк. :s
- одна из этих команд. То есть вы можете комбинировать :g and s
:%s
просто выполняет поиск и замену на весь буфер, хотя он может также делать некоторые другие вещи с выражением, но это не так просто, как :g
.
например:.
:g/foo/s/bar/blah/g
это будет делать подстановку bar->blah
на строках, которые содержат foo
. С :s
мы могли бы:
:%s/foo/\=substitute(getline('.'), 'bar','blah','g')
поэтому :g
проще.
Итак, если вы имеете дело с задачей подстановки, обычно :s
должен появиться первым. Если вы хотите сделать что-то вроде для всех строк, которые соответствуют xxx, я хочу удалить /join/indent/....... :g
, возможно, полезно для вас.