我在Windows上使用gVim。我有一个XML文件,其中包含如下内容(提取(:
<ExtendedAttributes />
</Activity>
<Activity Id="ded54c70-1ef4-4aeb-852e-3740882c36ff" Name="Activity 1">
<Performers>
<Performer>2212646c-2674-4329-9ddc-1f8376e952e1</Performer>
</Performers>
</Activity>
<Activity Id="cf70ec72-4d49-434a-abf3-aa3e8dc000b5" Name="Activity 2">
<Description>This is a dummy description</Description>
<Implementation>
<Task />
我想在每个活动的名称之前添加一个 ID,即
<Activity Id="ded54c70-1ef4-4aeb-852e-3740882c36ff" Name="Activity 1">
将成为
<Activity Id="ded54c70-1ef4-4aeb-852e-3740882c36ff" Name="10 Activity 1">
和
<Activity Id="cf70ec72-4d49-434a-abf3-aa3e8dc000b5" Name="Activity 2">
将成为
<Activity Id="cf70ec72-4d49-434a-abf3-aa3e8dc000b5" Name="20 Activity 2">
等等。我尝试了(<Activity Id="[0-9a-f-]*" Name=")@<=[A-Za-z ,]+
它可以获取"名称"属性的值。但是当我尝试使用 http://vim.wikia.com/wiki/Making_a_list_of_numbers 中提到的命令:let i=0 | g/.... | let i=i+1
时,我永远无法使其工作。我所能做的就是用序列号替换名称(而我想要 [序列号] [名称] 代替(
谁能说出一些启示?
谢谢。
奥利弗
[编辑]
我尝试了以下方法:
:let @a=1 | %s/(<Activity Id="[0-9a-f-]*" Name=")@<=([A-Za-z() ,&?;/]+)/=(@a+setreg('a',@a+1))/g
但它只用数字代替了名字,
:let @a=1 | %s/(<Activity Id="[0-9a-f-]*" Name=")@<=([A-Za-z() ,&?;/]+)/=(@a+setreg('a',@a+1)).2/g
但我得到"无效表达",
:let @a=1 | %s/(<Activity Id="[0-9a-f-]*" Name=")@<=([A-Za-z() ,&?;/]+)/=(@a+setreg('a',@a+1)).' '.2/g
但我得到"无效表达",
:let @a=1 | %s/(<Activity Id="[0-9a-f-]*" Name=")@<=([A-Za-z() ,&?;/]+)/=join((@a+setreg('a',@a+1)),' ',2)/g
但我得到"join((的参数无效",
:let @a=1 | %s/(<Activity Id="[0-9a-f-]*" Name=")@<=([A-Za-z() ,&?;/]+)/=(@a+setreg('a',@a+1))+2/g
但我得到"无效表达"。
假设您想要的 ID 是 Activity
后面的数字乘以 10(这是我从您的示例中理解的(,这可以通过以下方式完成:
:%s/Activity (d+)/=submatch(1) * 10 . " " . submatch(0)
故障。。。
在每一行上执行替换:
:%s/...
搜索
Activity
,后跟一个空格,后跟一个或多个数字,捕获数字:.../Activity (d+)/...
在"子替换表达式"中使用捕获的数字和整个匹配项:
.../=submatch(1)*10 . " " . submatch(0)
其中我们将捕获的数字连接 10、一个空格和整个匹配项。
请参阅
:help sub-replace
。
我终于找到了一种通过两步完成任务的方法:
1( 通过以下命令插入一个不太可能出现在内容中的静态字符串(例如
##%%##%%(: :%s/(<Activity Id="[0-9a-f-]*" Name=")@<=([A-Za-z() ,&?;/]+)/##%%##%% 2/g
2( 将静态字符串替换为数字序列:
:let @a=1 | %s/##%%##%%/=(@a+setreg('a',@a+1))/g
这确实不是一个完美的解决办法。 欢迎仅一步使用任何解决方案。谢谢。
这个仅在行尾的活动处更改。首先,我们分别尝试搜索
/Name="zs[^"]*ze"
然后问我们心爱的vim
let @a=10 | %s//=(@a+setreg('a', @a+10)) . " " . submatch(0)