使用正则表达式在vim函数内替换

时间:2014-06-25 05:18:01

标签: function vim

我试图将宏变成一个函数。虽然我可以保存宏,但我想把它变成一个我可以打电话的功能。

我使用以下

对大型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中有效的转义模式。

0 个答案:

没有答案