Vim - 复制每行的第 N 个单词,从第 10-100 行到行尾

Vim - Copy Nth word of each line, from line 10-100, to end of line

我有一个JavaClass

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 构造函数的第二个参数 As:

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 行的第五个单词放到每行的末尾?

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

英文:

  • 从第 10 行到第 100 行,
  • 执行以下正常命令而不关心重新映射,
  • 转到该行的第一列,
  • 跳转到第一个=,
  • 后退一个字,
  • 猛拉那个词,
  • 跳转到第一个右括号,
  • 在括号前进入插入模式,
  • 插入 , ",
  • 后面是无名寄存器的内容(就是我们之前拽出来的那个词),
  • 接着是 "

整个事情当然可以通过录音来完成:

qq
0f=byiwf)i, "<C-r>""<Esc>
q
:10,100norm! @q

试试这个:

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

编辑:拼写:

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