如何使用 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 根据模式将文本拆分为多行?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据一个字段是不是包含oracle sql中的逗号分隔字符串将单行拆分为多行?

如何在 JavaScript 中将长正则表达式拆分为多行?

如何将两个单独表中的两列拆分为视图中的多行?

如何在 vi/Vim 中的多行选择的开头插入文本

如何使 vim 语法突出显示整行?

如何使用 Python 将特定选定行拆分为多行