我正在学习power of g并希望删除包含表达式的所有行到句子的末尾(用句点标记)。像这样:
There was a little sheep. The sheep was black. There was another sheep.
(运行命令查找There was
之类的所有句子并删除到下一个句号。)
The sheep was black.
我试过了:
:g/There was/d\/\.
尝试“向前删除直到下一个时段”但我收到trailing characters
错误。 :g/There was/df.
但获得df. is not an editor command error.
有什么想法吗?
答案 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)
:%s/There was[^.]*\.\s*//g