3

我正在学习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.

有什么想法吗?

4

4 回答 4

4

与 相关的动作g必须能够在不需要来自g暗示的模式匹配的位置信息的情况下作用于该行。在您使用的命令中,delete forward 命令需要一个未提供的起始位置。

问题是g它只表示行匹配,而不是模式匹配的特定字符位置。我做了以下事情,它做了我认为你想要的:

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

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

这相当于:

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

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

于 2012-07-12T21:30:38.270 回答
3

我只会使用正则表达式:

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

注意如何\_.允许跨行句子

于 2012-07-12T21:13:58.683 回答
3

你可以:norm这样使用:

:g/There was/norm 0weldf.

这会找到带有“There was”的行,然后执行正常的命令0weldf.

0: 到行首
w: 到下一个单词 (在本例中是 "was")
e: 到词尾 (所以光标在 "was" 的 's' 上)
l: 向右移动一个字符 (所以我们不会删除任何 "was")
df.:删除直到下一个 '.',包括在内。

如果您想保留期间使用dt.而不是df..

如果你不想从行首删除,而是想做句子,:%s这里的命令可能更合适。(例如:%s/\(There was\)[^.]*\./\1/g,或者%s/\(There was\)[^.]*\./\1./g如果您想在句末保留句号。

于 2012-07-12T22:12:30.293 回答
2

使用搜索和替换

:%s/There was[^.]*\.\s*//g
于 2012-07-12T21:13:14.587 回答