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

2024-03-09

假设你有这样的文本:

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用换行符替换该空格


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

:%s/; /;\r/

进行操作only在选定的文本上,使用以下命令:

:'<,'>s/; /\r/

英文翻译:

"替换所有出现的 分号后跟一个空格 with 分号后跟换行符."

解释:

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

文件的每一行都会首先被分割; symbol.

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

/ ; ENTER S S

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 如何跳转到 vim 中不同选项卡内的标记?

    我使用 MacVim 通常会打开许多 选项卡 我希望能够在任何打开的文件中放置标记并在它们之间跳转 mK and K当标记位于同一个选项卡中时效果很好 但我必须使用gt找到选项卡 然后K找到标记 一定有更好的方法吗 这是一个快速而肮脏的技巧
  • XML 规范是否规定解析器需要始终将 \n\r 转换为 \n,即使 \n\r 出现在 CDATA 部分中?

    我在处理 xml 中的 line feed 和 carriage return 字符时遇到了问题 我知道 根据http www w3 org TR REC xml sec line ends http www w3 org TR REC x
  • 减少单元格中/chr(10) 的换行数

    我有一张 Excel 工作表 其中的单元格具有不同数量的换行符 我想减少它 以便每个新行之间只有一个换行符 例如 HELLO WORLD GOODBYE 将修改为 HELLO WORLD GOODBYE 我已经为此绞尽脑汁好几个小时了 并想
  • 使用 cscope 在头文件和实现文件之间切换的 Vim 脚本

    我目前使用的是A vim http vim wikia com wiki Easily switch between source and header file在头文件和实现文件之间交换的插件 该脚本的局限性在于 它仅在两者位于同一文件夹
  • 如何避免 git-apply 更改行结尾

    我有一个 git repo 设置core eol crlf core autocrlf true and core safecrlf true 当我应用另一个补丁时crlf存储库和我的存储库中受影响文件的所有行结尾都更改为lf 目前我正在应
  • Vim:用字符填充行

    如何在一行或多行末尾重复添加字符 将行填充到特定列 例如 x 代表第 40 列 不是该行上的字符 并且文本后没有空格或制表符 line one x line two x line three x line eleventy billion
  • 选项卡视觉选择

    In many GUIs when I select a section of text and then hit the Tab or Shift Tab button the selected section will indent i
  • Vim - 删除多行中的直到(包括)字符

    我有这个代码 def foo c Char c match case a B 我的光标位于后面的空格上 我想删除所有内容 直到 包括 我怎样才能做到这一点 我可以在光标位于第一行任意位置时执行相同操作吗 块中的任何位置 并将光标放在 d e
  • 如何在vim中的相同行数前面插入多行?

    假设我有两个文本块 其中之一在我的剪贴板中 one two three 另一个位于我正在 vim 中编辑的文件中 AAA BBB CCC 如何在第二个块前面插入第一个块以获得以下结果 oneAAA twoBBB threeCCC 我希望有一
  • 在插入模式下移至行首

    我知道我可以使用 Home in insert mode Esc i to exit insert mode and enter it again effectively going to the beginning of line But
  • 从文件中读取第n行的快速方法

    介绍 我有一个名为的 C 进程MyProcess我称之为nbLines时间 地点nbLines是一个名为的大文件的行数InputDataFile txt在其中可以找到输入数据 例如调用 MyProcess InputDataFile txt
  • 使用 .gitattributes 强制 LF 行结尾而不丢失自动文本/二进制推理?

    我想用eol LF在我的 gitattributes 文件中 但我希望它适用onlyGit 自动将文件确定为文本文件 我能找到的最好的方法是将特定的文件扩展名 全局定义为文本或二进制 这并不理想 因为列表可能很大 我试过了 text aut
  • 拆分为不同的换行符

    现在我正在做一个split在字符串上并假设用户的换行符是 r n像这样 string split r n 我想做的事分为两部分 r n要不就 n 那么正则表达式将如何分割其中的任何一个呢 你试过了吗 r n The 使得 r选修的 用法示例
  • 如何在会话自动加载的同时在 vim 中打开文件?

    我在 vimrc 中有以下代码 可以在 vim 启动时自动保存 加载会话 Session saving Automatically save rewrite the session when leaving Vim augroup leav
  • 当vim进入可视模式时运行命令

    我使用一个小脚本来触发插入模式以更改行号颜色 function CursorLineNrColorInsert mode Insert mode blue if a mode i highlight CursorLineNr ctermfg
  • Vimscript 检查当前缓冲区是否有未保存的更改

    我目前已设置状态行 使其在插入模式下为橙色 否则为白色 如果文件有任何未保存的更改 我想让它在我回到正常模式时变成另一种颜色 因为我经常在兔子洞里走一会儿 想知道为什么我的更改没有生效 小 还不够打我的脸 我找不到任何以 buf 开头且看起
  • 有没有办法在 Vim 中映射 Ctrl 句点和 Ctrl 逗号?

    我似乎找不到绘制地图的方法
  • vim - 如何删除 netrw?

    我正在测试https github com skwp dotfiles https github com skwp dotfiles 不幸的是它确实安装了很多我不想要的东西 例如 现在 使用空的 vimrc 当我打开 vim 时 我得到 N
  • 运行 tmux 时映射箭头键

    这些键映射在 tmux 中停止工作 在我的 vimrc 我有 nmap
  • 在键盘快捷键上插入预定义文本

    我经常插入binding pry当我调试我的 ruby 文件时 当我使用 Vim 时 我希望将其自动化 以避免每次都重新输入 我怎样才能做到呢 我想要映射的确切顺序是 插入新行 Insert binding pry到新创建的行 返回正常模式

随机推荐