vim:用行的第一个单词替换单词

标签 vim

问题
我有一个如下所示的文件:

word= something something aaa something aaa
word2= something something aaa something aaa
word3= something something aaa something aaa

请注意,“某物”不一定到处都是同一个词。此外,“something”和“aaa”不一定用空格分隔。

问题
我想用 vim 中该行的第一个单词替换所有出现的“aaa”。输出应如下所示:

word= something something word something word
word2= something something word2 something word2
word3= something something word3 something word3

到目前为止我主要研究了vim的搜索和替换语法,因为这是我最熟悉的。

感谢您的帮助!

最佳答案

对于完全使用正则表达式的解决方案,我建议这样做:

:%s/\v%(^([^=]+).*)@<=aaa/\1/g

这适用于宽度为零的后视 ( \@<= )。 \v在 正则表达式的开头只是为了通过启用“very magic”模式(参见 :h \v )。表达式本身:

%(^([^=]+).*)@<=aaa

后面的观察与第一组一起进行。 %()形式是非 捕获组(更快一点,并且不会算作数组中的编号之一) 代换)。内部组捕获任何不等号的东西,并且 在该组之后,任何内容都会匹配( .* )。这一切都不算 在正则表达式中,真正匹配的是 aaa ,然而这只是 如果前面有这些条件则匹配。当然前面是 他们,但目标是捕获第一个单词。

这个aaa然后被捕获的组替换,多次 一行( g 标志)和所有行( % 范围)。

关于vim:用行的第一个单词替换单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36455967/

相关文章:

linux - 运行! less.sh 中的变量

vim 插件目录优先级

vim - 如何禁用暂存预览窗口?

php - 直接在Vim中获取官方PHP函数文档

vim - 使用 VIM 增加 %z 十六进制数?

vim - 如何设置 vim 的自动完成弹出菜单位置?

Java System.out.print();,在 Eclipse 上的行为与在 Eclim 上的行为不同

vim - 当模式在当前缓冲区中没有匹配项时,为什么 `set shm+=s` 和 `cno <silent> <cr> <cr>` 使 Vim 显示搜索命令?

vim - 如何停止 vim 以默认语法读取?

vim:仅显示前导空格/制表符