如何仅在包含或不包含其他模式的行上替换模式?

时间:2012-08-17 17:23:33

标签: regex vim replace

说我有一个包含redblue字样的文字。

如何仅在包含单词blue的所有行中用单词green替换单词red的出现?

同样,如何在不包含单词blue的所有行中将green替换为red

2 个答案:

答案 0 :(得分:45)

替换" blue"与"绿色"在包含" red":

的行中
:g/red/s/blue/green

在不包含" red":

的行中进行替换
:g!/red/s/blue/green

答案 1 :(得分:3)

使用模式匹配地址

就像在sed中一样,您可以使用模式来处理要操作的地址。例如,给定以下文件:

foo bar
bar
foo bar baz
bar baz
quux bar

您将发出如下命令:

:g/^foo/s/bar/foobarbaz/g

解释

这将告诉Vim仅将模式匹配应用于以“foo”开头的每一行,并在每个匹配行中的多个匹配项上执行替换。因此,即使“bar”出现在多行上,通过此调用,您将得到以下输出:

foo foobarbaz
bar
foo foobarbaz baz
bar baz
quux bar

请注意,只会在行的开头以“foo”开头的行匹配,因此其他行上带有“bar”的行保持不变。