在vim中的特定行中搜索并更换
我可以用在vim中的特定行中搜索并更换,vim,Vim,我可以用 :5,12s/foo/bar/g 在第5行和第12行之间搜索foo并将其替换为bar。我怎样才能只在第5行和第12行(而不是在这两行之间)?有趣的问题。似乎只有范围选择,没有多行选择: 但是,如果第5行和第12行有特殊内容,可以使用:g运算符。如果您的文件如下所示(数字仅供参考): 在有enil的行中,您希望将one替换为eno,而不是line: :g/enil/s/one/eno/ Vim有特殊的正则表达式原子,它们在某些行、列等中匹配。;您可以使用它们(可能除了范围之外)来限
:5,12s/foo/bar/g
在第5行和第12行之间搜索
foo
并将其替换为bar
。我怎样才能只在第5行和第12行(而不是在这两行之间)?有趣的问题。似乎只有范围选择,没有多行选择:
但是,如果第5行和第12行有特殊内容,可以使用:g
运算符。如果您的文件如下所示(数字仅供参考):
在有enil
的行中,您希望将one
替换为eno
,而不是line
:
:g/enil/s/one/eno/
Vim有特殊的正则表达式原子,它们在某些行、列等中匹配。;您可以使用它们(可能除了范围之外)来限制匹配:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
请参见
:help/\%l
您可以使用ed
——一种面向行的文本编辑器,具有与vi和vim类似的命令。它可能早于vi和vim
在脚本中(使用here文档处理输入直到ENDCOMAND标记),它看起来像:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
ed file您可以在第5行进行替换,并在第12行以最小的工作量重复该操作:
:5s/foo/bar
:12&
正如Ingo所指出的,:&
忘记了你的标志。由于您使用的是/g
,正确的命令应该是:&&
:
:5s/foo/bar/g
:12&&
请参见:帮助:&
和朋友。您始终可以在末尾添加c
。这将要求确认每一场比赛
:5,12s/foo/bar/gc
一种比我想象的更复杂的方式,但完美地回答了我的问题。谢谢我看不出比vim有什么优势,vim也有同样的优势;实际上,数字可以放在:s
之前,但仍然存在:s
命令的重复(Romaill的解决方案避免了这一点)。我的观点是,用户可能希望选择远远多于两行的行进行编辑。在这种情况下,一种非交互式的方法可能会引起人们的兴趣——AFAIK不能用vim来做这件事。哦,vim可以做到这一点(例如,在“Ex”模式下),但你是对的,应该选择另一种工具而不是交互式编辑器。我的首选是sed
,不过…+1用于使用模糊的:&
。如果有标志(s/./../g
),就必须使用:&
,不过…@IngoKarkat,公平地说,我认为(\%5l\\\\\\%12l\)
比:&
更模糊。这实际上是假设如果第5行和第12行之间有很多匹配,那么这可能是一场噩梦(请记住,有一个g
标志在起作用)@doubleDown这并不是一个通用的解决方案(有许多可能的候选者),但在大多数情况下,你真的认为按n
5或6次比添加\(\%5l\\\\%12l\)更麻烦吗
替换语句?我发现这很有用,我想每隔一行修改一次,这比我最后做的要快。
:5,12s/foo/bar/gc