Vim - 将每行的第N个字从第10-100行复制到行尾

时间:2015-03-30 07:02:22

标签: vim

我有一个Java类

public class Constants{
    public static final MyClass field1 = new MyClass("arg1"); // line 10
    public static final MyClass field2 = new MyClass("arg2");
    ...
    public static final MyClass field101 = new MyClass("arg101"); //line 100
}

我希望将每行的第5个字作为MyClass的构造函数的第二个参数附加为:

public class Constants{
    public static final MyClass field1 = new MyClass("arg1", "field1"); // line 10
    public static final MyClass field2 = new MyClass("arg2", "field2");
    ...
    public static final MyClass field101 = new MyClass("arg101", "field101"); //line 100
}

为了简化,我们不要关心每一行末尾的");。 如何使用vim命令将第10行的第五个字放到第100行到每行的末尾?

2 个答案:

答案 0 :(得分:2)

:10,100normal! 0f=byiwf)i, "<C-v><C-r>""<CR>

英文:

  • 从第{{I}}行到第10行,
  • 执行以下正常命令而不关心重映射,
  • 转到该行的第一列,
  • 跳转到第一个100
  • 回到一个字,
  • 猛拉那个词,
  • 跳到第一个右括号
  • 在括号前输入插入模式,
  • 插入=
  • 后面跟着未命名的寄存器(我们之前抽过的字)的内容,
  • 后跟, "

当然,整个过程可以用录音来完成:

"

答案 1 :(得分:2)

试试这个:

:10,100s/\v^%(\s*\w+){4}\s+(\w+).*\zs\ze\)/, "\1"/

编辑:拼写出来:

  • :10,100 - 适用于10 - 100行
  • s/.../.../ - 替换
  • \v - 将正则表达式语法更改为&#34;非常神奇&#34;,因此我们可以编写%(...){...}+而不是{{1 }},\%(...\)\{...}
  • \+ - 在行首
  • 处锚定
  • ^ - 非捕获组;与%(...)相同,但它不会创建反向引用(也就是说,它不会向(...)添加任何内容,\1,...,{{1 }})
  • \2 - 空格+字
  • \N - 重复最后一项4次;也就是说,跳过前四个单词
  • \s*\w+ - 跳过空格
  • {4} - 捕获\s+
  • 中的下一个字词
  • (\w+) - 跳到最后一个括号;由于\1
  • .* ... \)变为)
  • \) - 开始替换;匹配所有内容,但只替换\v
  • 右侧的部分
  • \zs - 结束替换此处;匹配所有内容,但只替换\zs
  • 左侧的部分
  • \ze - 插入\ze; /, "\1"/来自, "foo",由于我们彼此相邻\1(\w+),效果是用\zs替换此时的空字符串