如何使用Vim基于模式将文本拆分成多行?

Ori*_*ski 14 vi vim newline line-breaks substitution

假设你有这个文字:

name1 = "John"; age1 = 41;
name2 = "Jane"; age2 = 32;
name3 = "Mike"; age3 = 36;
...
Run Code Online (Sandbox Code Playgroud)

并且您希望将每一行拆分为两行以得到如下结果:

name1 = "John";
age1 = 41;
name2 = "Jane";
age2 = 32;
name3 = "Mike";
age3 = 36;
...
Run Code Online (Sandbox Code Playgroud)

你会如何自动化这个操作?

一些说明:

  1. 我已经尝试过以下方法:
    (1)在virtual-vode中选择文本,
    (2)执行:'<,'>:norm ^3f r^M***,
    但它不能正常工作; 它只分割了一半的行,因为在每一行被打破之后,该命令的下一次重复将应用于其余的虚线而不是下一行!
  2. 这可以通过宏实现,但我正在寻找更优雅的解决方案.


***序列说明:

- norm用于在正常模式下执行以下命令
- ^用于将光标移动到行的开头
- 3f<space>用于将光标移动到行中的第3个空格
- r^M用新行替换该空格

jah*_*roy 31

要对整个文件进行操作,请使用以下命令:

:%s/; /;\r/
Run Code Online (Sandbox Code Playgroud)

仅对选定的文本进行操作,请使用:

:'<,'>s/; /\r/
Run Code Online (Sandbox Code Playgroud)

英文翻译:

" 替换每次出现的 分号,然后用分号 替换一个空格, 然后换行."

说明:

%    -    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)
Run Code Online (Sandbox Code Playgroud)

这与Vi中的替换基本相同.


为了更加热心:

我实际上在我的.vimrc文件中映射了以下这样的情况:

"
" add a newline after each occurrence of the last search term
"
nnoremap SS :%s//&\r/<CR>
Run Code Online (Sandbox Code Playgroud)

此命令在最后一次搜索模式的第一次出现时拆分文件的每一行.

因此,对于您的用例,您可以这样做:

  1. 搜索;(您可能想要也可能不想要包含空间......由您自己决定)
  2. 在正常模式下键入以下命令: SS

文件的每一行都将在第一个;符号处拆分.

为了澄清,您将使用以下5个击键:

/ ; ENTER S S

这对于快速格式化XML,HTML等非常方便...