如何使用 Vim 根据模式将文本拆分为多行?
Posted
技术标签:
【中文标题】如何使用 Vim 根据模式将文本拆分为多行?【英文标题】:How to split text into multiple lines based on a pattern using Vim? 【发布时间】:2013-07-14 01:44:31 【问题描述】:假设你有这个文本:
name1 = "John"; age1 = 41;
name2 = "Jane"; age2 = 32;
name3 = "Mike"; age3 = 36;
...
你想把每一行分成两行,得到这样的结果:
name1 = "John";
age1 = 41;
name2 = "Jane";
age2 = 32;
name3 = "Mike";
age3 = 36;
...
您将如何自动化此操作?
一些注意事项:
-
我已经尝试过以下方法:
(1)选择virtual-vode中的文字,
(2) 执行
:'<,'>:norm ^3f r^M
***,
但它不能正常工作;它只分割了一半的行,因为在每一行都被打破后,命令的下一次重复适用于断行的其余部分,而不是下一行!
这可以使用宏来实现,但我正在寻找更优雅的解决方案。
*** 顺序说明:
-norm
用于在正常模式下执行以下命令-^
用于将光标移动到行首-3f<space>
用于将光标移动到行中的第三个空格-r^M
用于用换行符替换该空格
【问题讨论】:
How to replace a character for a newline in Vim? 的可能重复项 【参考方案1】:要对整个文件进行操作,请使用:
:%s/; /;\r/
要仅对所选文本进行操作,请使用以下命令:
:'<,'>s/; /\r/
英文翻译:
"替换所有出现的 分号后跟空格 用 分号后跟换行符。”
说明:
% - operate on the entire file
s - substitute
/ - symbol that separates search/replace terms
; - the character you're searching for (notice I added a space)
;\r - the replacement text (semi-colon followed by newline)
这与 Vi 中的替换一样基本。
更多极客:
实际上,我的.vimrc
文件中映射了以下情况:
"
" add a newline after each occurrence of the last search term
"
nnoremap SS :%s//&\r/<CR>
此命令在最后一个搜索模式第一次出现时拆分文件的每一行。
因此,对于您的用例,您可以这样做:
-
搜索
;
(您可能希望也可能不希望包含空格...由您决定)
在正常模式下键入以下命令:SS
文件的每一行都将在第一个 ;
符号处拆分。
为了澄清,您将使用以下 5 次击键:
/ ; ENTER S S
这对于快速格式化 XML、html 等非常方便...
【讨论】:
以上是关于如何使用 Vim 根据模式将文本拆分为多行?的主要内容,如果未能解决你的问题,请参考以下文章