我有一个纯文本,我想将每个句子放在自己的行上。我看到了Perl的一些答案,但我只使用Vim。
答案 0 :(得分:1)
针对Perl的答案可能使用了正则表达式,将正则表达式语法转换为Vim相对容易。 :help perl-patterns
应该为您提供语法差异的线索。
我想提出一个采用递归宏定义和Vim的句子运动(:help (
)的解决方案。首先,一次替换:
)hr<CR>
这跳到下一个句子()
),然后移回到分隔的空格(h
),并用换行符(r<CR>
)替换。
要将其转换为可重复的宏(直到某些操作无法再执行并中止),请首先清除宏寄存器(例如a
)并开始记录:qaqqa
。然后插入上面的操作,并以宏调用@q
作为结束。结束宏(q
)并调用它(@a
)。完整的宏(现在使用寄存器q
):
qqqqq)hr<CR>@qq@q
这将在空行处停止并将换行符保留在句子中;您可能需要先:join
所有行。另外,您也可以调整替换(r<CR>
),也许调整为c
hange命令。由于您在问题中没有提及任何详细要求,因此我将其保留。
答案 1 :(得分:0)
我认为这个问题不太清楚。我看到其他一些答案尚不清楚的问题..所以..让我尝试一下吗?
如果要分隔的句子在一行中,而“句号”仅用于分隔该行,则可以尝试使用以下命令将其分隔:
:%s/\./.\r/g ^ ^ (change the dots by the character you want if needed)
这将在.
的缓冲区中全局查找,将其自身替换为(hmm)并添加行返回(\r
)。
然后,您可能必须使用:%le
删除缩进以将左侧的行设置格式。
ps:Rkta的建议(根据评论)%s/\([\.!\?]\)/\1\r/gc
看起来也很好(也许更好?)。 Amadam评论也很重要。
欢迎来到stackoverflow。阅读stackoverflow.com/tour页可能会帮助您完成任务;)