vim一次选择/编辑多个非连续行

时间:2013-05-08 11:19:40

标签: vim

我有一个包含字符串的文件:

 8 deb http://ftp.de.debian.org/debian/ stable main contrib non-free
 9 deb http://ftp.de.debian.org/debian/ stable main contrib non-free
10 deb http://ftp.de.debian.org/debian/ testing main contrib non-free
11 deb http://ftp.de.debian.org/debian/ testing main contrib non-free
12 deb http://ftp.de.debian.org/debian/ sid main contrib non-free
13 deb http://ftp.de.debian.org/debian/ sid main contrib non-free
14 deb http://ftp.de.debian.org/debian/ experimental main contrib non-free
15 deb http://ftp.de.debian.org/debian/ experimental main contrib non-free

我只需要在第9,11,13,15行编辑地址。 我只是好奇,在vim中有没有任何简单的黑客(比如只选择这一行并在所选范围内替换)? 或者我应该录制宏并将其应用于我需要的字符串。

2 个答案:

答案 0 :(得分:3)

如果有可能通过正则表达式选择这些行,我们可以

:g/pattern/s/foo/bar/

如果不可能,则需要编写一个小函数。该函数并不复杂,只是getline(在给定列表中包含lineNO),然后进行替换,最后返回setline。但是我不知道这是否属于你的“简单黑客”。

使用功能,你也可以这样做:

do substitution on lines with  10 <line number <50 and line number is odd.

这样您就不必输入这些数字了。

你可能会意识到,shell命令更容易处理这种东西。您可以选择调用外部命令来处理vim中的文本。

例如:

%!awk 'NR==3||NR==5{gsub(/deb/,"foo")}1'

或用上面的例子代替,奇数行号:10-50

%!awk 'BEGIN{for(i=11;i<50;i+=2)l[i]}NR in l{gsub(/foo/,"bar")}1'

您也可以直观地选择文本并将其传递给外部命令。

希望它有所帮助。

答案 1 :(得分:1)

有一个插件可以让你拥有“多个游标”。我自己没试过,但你应该看看它是否能解决你的问题:

http://www.vim.org/scripts/script.php?script_id=4523