一次选择/编辑多个非连续行的Vim技巧

5

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

 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中是否有简单的技巧(例如仅选择这些行并在所选范围内进行替换)可以做到这一点? 还是说我应该录制一个宏并将其应用于我需要的字符串。

8、9、10……这些数字是用来帮助解释你的问题的吗? - Kent
不,它们只是用来解释的行号。 - rush
我很好奇是否可能。同时,也许你可以使用 :%s/foo/bar/gc这个命令。它会将每个'foo'更改为'bar',但是首先会要求确认。 - ThanksForAllTheFish
1
另一个选项是在一行中进行替换,然后使用&命令在其他行中重复替换。 - Carlos Campderrós
可能是重复的问题:在Vim上查找和替换多行字符串 - Anshul Goyal
2个回答

3
如果可以用正则表达式选择这些行,我们就可以进行操作。
:g/pattern/s/foo/bar/

如果不可能的话,您需要编写一个简单的函数。这个函数并不复杂,只需要使用给定列表中的lineNO调用getline函数,然后进行替换,最后再调用setline函数将其设置回去即可。不过我不确定这是否属于您所说的“简单的hack”。
有了这个函数,您也可以像这样操作:
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'

你可以通过可视化选择文本并将其传递到外部命令来实现。希望这有所帮助。

感谢您的帮助。这样我们可以使用sed,看起来更适合这个特定的任务。sed '9,15{s/foo/bar/;n;}'。我对内部事务(或插件)很好奇。 - rush
好的,awk只是外部命令的一个例子。就个人而言,我觉得awk比sed更舒适。 :) - Kent
我认为Vim用户通常会更喜欢使用sed,因为sed和Vim都基于ed,因此具有类似的语法。 - Idan Arye

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接