在 Vim 中替换列中空格分隔文件中的值

在 Vim 中替换列中空格分隔文件中的值

我有一个如下文件:

2067 24311 <hkxhk> {00}
2069 17219 <hkxhk> {00}
2071 20931 <hkxhk> {00}
2073 5557  <hkxhk> {00}
2075 2127  <hkxhk> {00}
2077 20947 <hkxhk> {00}
2081 18088 <hkxhk> {00}

我想替换第一列的值,使其看起来像

5 24311 <hkxhk> {00}
5 17219 <hkxhk> {00}
5 20931 <hkxhk> {00}
5 5557  <hkxhk> {00}
5 2127  <hkxhk> {00}
5 20947 <hkxhk> {00}
5 18088 <hkxhk> {00}

其中第一个空格分隔的列已被新值替换,在本例中为 5。

答案1

使用搜索和替换:

:%s/^\S*/5/

%s– 在整个文件中搜索, ^– 行首, \S– 任何非空格字符, \S*– 任意数量的非空格字符, 5– 您的新值。

使用宏:

qq0cw5<Esc>q
:%norm! @q

qq– 开始录制名为 的宏q0– 将光标置于行首, cw5– 替换 (Change) 一个加上5<Esc>– 返回正常模式, q– 结束录制宏;

%norm!– 将正常模式命令应用到文件的每一行, @q– 执行宏q(正常模式命令)。

使用视觉选择假设第一列的宽度为恒定值(4 个字符)

gg0<C-v>G3lc5<Esc>

gg0– 将光标放在文件开头, <C-v>– 启动块选择模式, G– 转到最后一行,因此选择一个字符宽度的列(H×1 块), 3l– 向左移动三个字符,因此选择 H×4 块, c5<Esc>– 用替换每行中的选择5并返回正常模式。

结论

您的问题非常简单,以至于搜索和替换方法在这里是最简单的,而一般情况下,记录宏比发明正则表达式要方便得多。

答案2

如果您使用的是 Linux、Mac OSX 或 MINGw,或者任何具有该column工具的系统(如果您使用 Vim,则可能性非常高),那么您可以使用它来对您的文件进行列化:

您可以command直接从提示符执行该工具。例如:

column my-file.txt -t -s "|" -o " | " > my-file-columnated.txt

或者你可以在命令模式下从 Vim 执行它:

  • :%!column -t -s "|" -o " | "
  • :是执行命令的标准。
  • %影响整个文件内容。如果省略它,则将仅对选定的行执行操作。如果没有选定行,则将仅影响当前行。
  • !执行外部工具。

而且,如果您的列分隔符只是一个空格,就像原始海报的情况一样,那么您很幸运,因为使用的默认分隔符column恰好是空格:

:%!column -t

相关内容