如何使用 Vim 根据模式将文本拆分为多行?

问题描述 投票:0回答:2

假设你有这样的文字:

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. 这可以使用宏来实现,但我正在寻找更优雅的解决方案。


*** 顺序说明:

-

norm
用于在正常模式下执行以下命令
-
^
用于将光标移动到行首

-
3f<space>
用于将光标移动到该行的第三个空格

-
r^M
用于用换行符替换该空格

vim newline vi line-breaks substitution
2个回答
40
投票

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

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

文件的每一行都会在第一个

;
符号处分割。

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

/ ; ENTER S S

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


0
投票

:s/ /G 尾随 g 使替换在一行上全局化。 要对整个文件执行此操作,您也可以使用旧式 vi :1,$s//g

当我发现这篇文章时,我正在解决的问题是在 图案。 我的解决方案是 :s/ / /g

© www.soinside.com 2019 - 2024. All rights reserved.