使用find -exec编写Vim脚本

时间:2010-10-13 18:55:54

标签: vim find replace

我有一个小的Vim脚本,可以进行多行搜索并替换:

vim -c 's/^ *<hi a=\"26\">\nHello/<td height=\"26\">\r<\/table>\r<bla \/>' \
    -c 'w!' -c 'q' test.html

有效。但是,当我把它放在find -exec中时,在目录中递归执行:

find . -iname 'test.html' -exec \
    vim -c 's/^ *<hi a=\"26\">\nHello/<td height=\"26\">\r<\/table>\r<bla \/>' \
    -c 'w!' -c 'q' \
{} \;

test.html保持不变,Vim给了我这个错误:

Pattern not found:
  ^ *<hi a=\"26\">\nHello
in ./test.html

这真的很奇怪,因为这是正确的正则表达式,我可以在Vim中手动搜索它成功。

你能用find语法看到任何明显的错误吗?

3 个答案:

答案 0 :(得分:4)

我明白了!搜索模式需要%字符:vim -c '%s/switch/to/'是正确的语法。

答案 1 :(得分:2)

当我做这样的事情时,我倾向于在vim中做这件事。

:vimgrep /^ *<hi a=\"26\">\nHello/ **/*

然后创建和执行递归宏:

qbq
qa (actually you don't press enter after this)
:silent! !p4 edit %  " check out the file
:e  " refresh the r/w status
:%s/^ *<hi a=\"26\">\nHello/<td height=\"26\">\r<\/table>\r<bla \/>
:w  " no need to force write if it's r/w
:cnf
q
qb@a@bq
@b

答案 2 :(得分:0)

你必须逃避exec短语中的大括号(假设你没有,也许论坛帖子吃了反斜杠)。它应结束\ {\} \;