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"
.
我有一个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"
.