Ответ от Томаса в порядке.Другим подходом может быть отрицательный взгляд назад:
:%s/\(#.*\)\@<!old/new/g
Этот метод соответствует каждому old
, которому не предшествует #
, в то время как метод Thomas соответствует каждой строке, не начинающейся с #
и затем соответствует каждому old
в этой строке.
Решение Кента немного более элегантно.Он использует :v
, что совпадает с :g!
.Он соответствует каждой строке, начинающейся с #
, а затем запускает команду для каждой другой строки.Преимущество в том, что регулярное выражение становится легче.В вашем сценарии использования регулярное выражение не соответствует, это довольно легко, но часто проще создать регулярное выражение, соответствующее критерию, чем тот, который не соответствует.поэтому здесь помогает команда :v
.
В вашем случае команда global
(оба других ответа используют global
) кажется более безопасной, поскольку она проверяет только #
в началелинии.Но в зависимости от варианта использования все три метода имеют свои преимущества