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

时间:2013-07-16 02:28:04

标签: vim newline vi line-breaks substitution

假设您有此文:

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

  3. *** 对序列的解释:

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

1 个答案:

答案 0 :(得分:29)

要对整个文件进行操作,请使用:

:%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>

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

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

  1. 搜索;(您可能想要也可能不想包含空格......由您决定)
  2. 在正常模式下键入以下命令:SS
  3. 文件的每一行都会在第一个;符号处拆分。

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

    / ; ENTER S S

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