我试图将宏变成一个函数。虽然我可以保存宏,但我想把它变成一个我可以打电话的功能。
我使用以下
对大型xml文件串联中的特定元素进行重复数据删除G$b"myw0"n4ywdd:264501?^Rn/\dcw^Rm^[
将最后一行的部分放入寄存器m和n然后转到重复数据删除数据上方的已知行,并向后搜索寄存器n的内容,并用寄存器m
替换该行中的数字。已知的行是为了确保我找到第一个不属于去重复数组的部分。如果在运行600次时有点慢,则可以正常工作。
在该功能上,我设法复制除cw
以外的所有内容以及m
部分内容。
function! MakeUnique()
let i = 0
while i <= 1
:200
:let @n=""
:let @m=""
:normal! G
:normal! $
:normal! b
:normal! "myw
:normal! 0
:normal! "n4yw
:200
execute "call search('".@n."','b')"
let i += 1
endwhile
endfunction
我尝试了以下几行的替换组合,但没有成功。
尝试1
注册n
= <dataid>389
并注册m
= <dataid>333
我为此尝试更改了文件末尾的行,并将"nyw
更改为ny$
<dataId>333<dataid> <dataId>389
我希望子命令在执行时会读取. s/<dataId>333/<dataId>389/
let subCommand=". s/".@m"/'".@n."'/"
exec subCommand
但鉴于结果,似乎@n正在扩展
Result:
</dataid>
尝试2
在这种情况下@n
= 389
let subCommand=". s/[0-9][0-9][0-9]/".@n."/"
exec subCommand
这个有用,但\ d +部分可能是3到5位数,在这种情况下我无法使用正则表达式,即
s/\(\d\+\)/".@m."/
不起作用,我得到E486: Pattern not found d+
问题:
有没有办法在let subcommand =
位中使用正则表达式匹配,例如let subCommand = ". s/\d+/".@n"/"
或者如何使用
之类的内容替换let subCommand=". s/".@m"/'".@n."'/"
或者是否有等同于cw^Rm
的vimscript?
数据示例,减少到适合。
宏的第一次迭代会在下面标识的行中将6415
更改为8790
。
我试图在一个函数中复制它。
1 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
2 <createsaleRequest>
3 <sale>
4 <saleNumber>9987166</saleNumber>
5 <dataId>6315</dataId>
6 </sale>
7 ...
8 </createsaleRequest>
9
10
11 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
12 <createsaleRequest>
13 <sale>
14 <saleNumber>9988166</saleNumber>
15 <dataId>6415</dataId>
16 </sale>
17 ...
18 </createsaleRequest>
19
20 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
21 <createsaleRequest>
22 <sale>
23 <saleNumber>9987921</saleNumber>
24 <dataId>6315</dataId>
25 </sale>
26 ...
27 </createsaleRequest>
28
29
30 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
31 <createsaleRequest>
32 <sale>
33 <saleNumber>9987411</saleNumber>
34 <dataId>6415</dataId> <!-- Change this on first run through -->
35 </sale>
36 ...
37 </createsaleRequest>
38
39 <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
40 <createsaleRequest>
41 <sale>
42 <saleNumber>9987411</saleNumber>
43 <dataId>6193</dataId>
44 </sale>
45 ...
46 </createsaleRequest>
47
48
49
50
51 <dataId>6315</dataId> 6789
52 <dataId>6415</dataId> 8790
修改 添加了一个减少数据示例,尝试使问题有意义。
修改
发现了问题。我将第二个.
排除在比赛部分之外。这个let subCommand=". s/".@m."/".@n."/"
可以工作,并且明显比宏快。不知道如何结束这个问题。
我想知道&#34;。 &#34;手段。我猜它是一个在vimscript中有效的转义模式。