我有一个如下文件:
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
– 开始录制名为 的宏q
,
0
– 将光标置于行首,
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,则可能性非常高),那么您可以使用它来对您的文件进行列化:
column
是用于对列表进行分栏的 Linux 工具-t
计算文件所含的列数。-s
当计算列数时,将其解释为当前列分隔符。-o
修改文件时,使用它作为新的列分隔符。
您可以command
直接从提示符执行该工具。例如:
column my-file.txt -t -s "|" -o " | " > my-file-columnated.txt
或者你可以在命令模式下从 Vim 执行它:
:%!column -t -s "|" -o " | "
:
是执行命令的标准。%
影响整个文件内容。如果省略它,则将仅对选定的行执行操作。如果没有选定行,则将仅影响当前行。!
执行外部工具。
而且,如果您的列分隔符只是一个空格,就像原始海报的情况一样,那么您很幸运,因为使用的默认分隔符column
恰好是空格:
:%!column -t