Почему ex (vim) перехватывает соответствующий шаблон до конца строки
Файл содержит следующую строку:
[assembly: AssemblyVersion("1.0.0.0")]
Скрипт Bash, который заменяет одну версию на другую:
echo "%s/AssemblyVersion\s*\(.*\)/AssemblyVersion(\"$newVersionNumber\")]/g
w
q
" | ex $filePath
Вопрос в том, почему это цепляет всю строку до конца, поэтому я должен добавить ]
в конце строки замены?
1 ответ
Проблема возникает потому, что .*
сопоставляет все символы до конца строки и \(
а также \)
создать группу захвата (в отличие от большинства двигателей регулярных выражений NFA, регулярное выражение Vim соответствует (
полукокса с укрытием (
а также )
с неуправляемым )
в шаблоне).
Вы можете использовать
%s/AssemblyVersion\s*([^()]*)/AssemblyVersion(\"$newVersionNumber\")/g
Вот, AssemblyVersion
будет соответствовать слову, то \s*
будет соответствовать любым 0+ пробелам, (
будет соответствовать буквальному (
, [^()]*
будет соответствовать 0+ символов кроме (
а также )
, а также )
будет соответствовать буквальному )
,
Другая команда подстановки регулярных выражений, которую вы можете использовать:
:%s/AssemblyVersion\s*(\zs[^()]*\ze)/\"$newVersionNumber\"/g
Вот, AssemblyVersion\s*(
будет соответствовать AssemblyVersion
, 0+ пробелов и (
а также \zs
пропустит эту часть в матче, затем 0+ символов кроме (
а также )
будет соответствовать, а затем \ze)
проверим есть ли )
справа от текущего местоположения, но не добавит его в матч.
\zs
устанавливает следующий символ в качестве первого символа матча. Любой текст перед \zs
шаблон не будет включен в матч.
\ze
устанавливает конец матча. Что-нибудь после \zs
шаблон не будет частью матча.