Подтвердить что ты не робот

В чем разница между: g и:% s командами в vim

сегодня я начал использовать vim. Я запутался в командах :g и :%s. Итак, в чем разница между командами :g или :%s?

4b9b3361

Ответ 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, возможно, полезно для вас.