4

我有一个带字符串的文件:

 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 中是否有任何简单的技巧(比如只选择这一行并在选定范围内替换)来做到这一点?或者我应该记录一个宏并将其应用于我需要的字符串。

4

2 回答 2

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'

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

希望能帮助到你。

于 2013-05-08T12:24:01.280 回答
1

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

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

于 2013-05-08T12:16:05.973 回答