文件包含以下行:
[assembly: AssemblyVersion("1.0.0.0")]
将一个版本替换为另一个版本的 Bash 脚本:
echo "%s/AssemblyVersion\s*\(.*\)/AssemblyVersion(\"$newVersionNumber\")]/g
w
q
" | ex $filePath
问题是为什么这会抓住整行到最后,所以我必须]
在替换字符串的末尾添加?
出现问题是因为.*
将所有字符匹配到行尾,\(
并\)
创建一个捕获组(与大多数 NFA 正则表达式引擎不同,Vim 正则表达式匹配模式中未转义和未转义的(
字符)。(
)
)
您可以使用
%s/AssemblyVersion\s*([^()]*)/AssemblyVersion(\"$newVersionNumber\")/g
在这里,AssemblyVersion
将匹配单词,然后\s*
将匹配任何 0+ 空白字符,(
将匹配文字(
,[^()]*
将匹配除(
and之外的 0+ 字符)
,)
并将匹配文字)
。
您可以使用的另一个正则表达式替换命令是
:%s/AssemblyVersion\s*(\zs[^()]*\ze)/\"$newVersionNumber\"/g
在这里,AssemblyVersion\s*(
将匹配AssemblyVersion
, 0+ 个空格和(
and\zs
将从匹配中省略该部分, 然后 0+ 字符而不是(
and)
将被匹配, 然后\ze)
将检查)
当前位置的右侧是否有, 但不会添加它到比赛。
\zs
将下一个字符设置为匹配的第一个字符。模式之前的任何文本\zs
都不会包含在匹配中。
\ze
设置比赛的结束。模式之后的任何内容\zs
都不会成为匹配的一部分。