1

我在 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中提到的命令时,我永远无法让它工作。我所能做的就是用序列号替换名称(而我想要 [serial number] [name] 代替)

任何人都可以解释一下吗?
非常感谢。

奥利弗

[编辑]

我尝试了以下方法:

: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

但我得到“无效的表达”。

4

3 回答 3

2

假设您想要的 ID 是下面的数字Activity乘以 10(这就是我从您的示例中理解的),这可以通过以下方式完成:

:%s/Activity \(\d\+\)/\=submatch(1) * 10 . " " . submatch(0)

故障…</p>

  • 在每一行上执行替换:

    :%s/...
    
  • 搜索Activity,后跟一个空格,后跟一个或多个数字,捕获这些数字:

    .../Activity \(\d\+\)/...
    
  • 在“子替换表达式”中使用捕获的数字和整个匹配:

    .../\=submatch(1)*10 . " " . submatch(0)
    

    我们将捕获的数字连接到 10、一个空格和整个匹配项。

    :help sub-replace

于 2018-01-29T08:50:34.743 回答
0

我终于想出了一个分两步完成任务的方法:

1)通过命令插入一个不太可能出现在内容中的静态字符串(例如##%%##%%):

:%s/\(<Activity Id="[0-9a-f-]*" Name="\)\@<=\([A-Za-z() ,&?;/]\+\)/##%%##%% \2/g

2)用数字序列替换静态字符串:

:let @a=1 | %s/##%%##%%/\=(@a+setreg('a',@a+1))/g

确实,这不是一个完美的解决方案。欢迎任何仅针对 1 步的解决方案。非常感谢。

于 2018-01-29T09:00:07.140 回答
0

这仅在行尾的 Activity 处更改。首先,我们分别尝试搜索

/Name="\zs[^"]*\ze"

然后问我们心爱的vim

let @a=10 | %s//\=(@a+setreg('a', @a+10)) . " " . submatch(0)
于 2018-01-30T18:18:31.127 回答