我有一个文本文件,如下所示:
--------
FOX&DOGS
The quick brown. Fox
jumped.
Over the lazy dogs.
-------------------
我想将其更改如下:
--------
FOX&DOGS
The quick brown. Fox jumped.
Over the lazy dogs.
-------------------
所以总的来说:
- 保留空行
- 在任何period_newline"."(段落末尾...在上面的例子中,我不想在"棕色"之后剪线。 例如:只有一个句点,但没有后跟换行符,所以它不是段落的结尾,所以它必须保持在同一行(
我的解决方案:
%s/nn/@r@r/ | %s/.n/.@r/ | %j | s/@ /r/g | $$d
这个想法有点粗鲁:
- 标记段落的所有结尾和空行(我选择"@"作为标记(
- 将所有行连接成一个长单行 将标记"@">
- (@ 后面有一个空格(替换为回车符"\r"(换行符(
- 删除在此过程中创建的最后一个空行
它似乎有效,所以我还在 vimrc 中创建了一个别名:
command Par %s/nn/@r@r/ | %s/.n/.@r/ | %j | s/@ /r/g | $$d
问题: 如果没有任何空行,它将返回错误"找不到模式",并且不会更改任何内容。似乎需要一种条件指令(如果您发现模式将其替换为...否则不要停止,继续执行其他命令(。
有什么想法可以用简单的方式解决吗?
也许我找到了一个解决方案:
-
在最后一个行之后添加一个空行,以便始终找到模式"">,即使它不存在于原始文件中,并且错误无法阻止下一个命令。
-
最后,我们将不得不删除由替换"s/@/\r/g">创建的底部的 2 个空白行
所以我尝试的命令是:
$ | put _ | %s/nn/@r@r/ | %s/.n/.@r/ | %j | s/@ /r/g | $$d | $$d
- $转到最后一行
- 追加空行
- 使用 @ 字符标记涉及空行(也添加最后一个空行(的换行符 标记涉及句点
- 的换行符(由于在上一步中添加了标记 @,最后一行不能以句点结尾(
- 将所有行连接成一条长线
- 用换行符替换标记"@">(这里我们在底部再创建两个空白行,必须删除(
- 删除添加的最后两个空白行
局限性:
如果段落以"句点"以外的标点符号结尾,则根本不起作用。
欢迎任何改进我的原始单线的想法!