gVim 使用正则表达式在每个匹配模式之前插入序列号



我在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)

相关内容

  • 没有找到相关文章

最新更新