Vim:删除包含模式的所有行的字符

时间:2012-07-12 21:04:53

标签: vim

我正在学习power of g并希望删除包含表达式的所有行到句子的末尾(用句点标记)。像这样:

There was a little sheep. The sheep was black. There was another sheep.

(运行命令查找There was之类的所有句子并删除到下一个句号。)

The sheep was black.

我试过了:

  1. :g/There was/d\/\.尝试“向前删除直到下一个时段”但我收到trailing characters错误。
  2. :g/There was/df.但获得df. is not an editor command error.
  3. 有什么想法吗?

4 个答案:

答案 0 :(得分:4)

g相关联的操作必须能够在该行上操作,而不需要g暗示的模式匹配中的位置信息。在您使用的命令中,delete forward命令需要一个未提供的起始位置。

问题是g仅表示行匹配,而不表示其模式匹配的特定字符位置。我做了以下工作,它做了我认为你想要的东西:

:g/There was/s/There was[^.]*[.]//

找到与模式There was匹配的行,并使用空字符串替换正则表达式There was[^.]*[.]

这相当于:

:1,$s/There was[^.]*[.]//g

我不确定g在您的用例中是什么,除了自动应用到整个文件行范围(与1,$%相同)。后一个示例中的g与将替换应用于同一行上的所有模式有关,而不是替换命令影响的行范围。

答案 1 :(得分:3)

我只是使用正则表达式:

%s/There was\_.\{-}\.\s\?//ge

请注意\_.如何允许跨线句

答案 2 :(得分:3)

您可以像这样使用:norm

:g/There was/norm 0weldf.

这会找到带有“有”的行,然后执行普通命令0weldf.

0:转到行首 w:转到下一个字(在这种情况下,“是”)
e:单词的结尾(因此光标位于“是”的's') l:向右移动一个字符(因此我们不删除任何“是”)
df.:删除直到下一个'。',包括在内。

如果您想使用dt.而不是df.来保持句号。

如果你不想从行的开头删除而是想做句子,那么:%s命令可能更合适。 (例如:%s/\(There was\)[^.]*\./\1/g%s/\(There was\)[^.]*\./\1./g,如果您想将句点保留在句子的末尾。

答案 3 :(得分:2)

使用search and replace

:%s/There was[^.]*\.\s*//g