在Vim中如何将文件1的整列复制到文件2指定位置
在Vim中批量将文件1第一列内容添加到文件2每行开头的实现方法
需求说明
现有两个文件,需将文件1的第一整列内容追加到文件2每行开头:
文件1内容
F#1 A1 B1 C1 F#1 A2 B2 C2 F#1 A3 B3 C3 F#1 A4 B4 C4 F#1 A5 B5 C5 F#1 A6 B6 C6
文件2内容
D1 E1 F1 D2 E2 F2 D3 E3 F3 D4 E4 F4 D5 E5 F5 D6 E6 F6
目标格式
F#1 D1 E1 F1 F#1 D2 E2 F2 F#1 D3 E3 F3 F#1 D4 E4 F4 F#1 D5 E5 F5 F#1 D6 E6 F6
实现方案
方案一:寄存器+全局替换(适合文件1第一列内容统一的场景)
- 打开文件1,光标定位到第一行的
F#1上,执行yiW复制该内容到默认寄存器(也可用y^选中行首到第一个空格前的内容)。 - 打开文件2,执行全局替换命令:
命令解释::%s/^/\=getreg('"') . ' '/%s/^/匹配所有行的开头,\=getreg('"')调用默认寄存器中的内容,. ' '添加指定的空格分隔符。
方案二:分窗可视块编辑(适合文件1第一列内容不统一、需逐行对应追加的场景)
- 打开文件2,执行
:split 文件1横向分窗(或:vsplit 文件1纵向分窗),同时显示两个文件。 - 切换到文件1的窗口,按
Ctrl+v进入可视块模式,光标移到第一行第一列后按G跳转到最后一行,选中整个第一列。 - 按
y复制选中的块内容。 - 切换到文件2的窗口,光标移到第一行第一列,按大写
P将块内容粘贴到每行开头。
注意:此方法要求两个文件行数完全一致,才能保证每行内容正确对应。
方案三:Ex命令批量处理(无需分窗,适合大文件场景)
- 打开文件2,执行命令读取文件1的第一列内容并存入寄存器
a:
命令解释::let @a = join(readfile('文件1') -> map({_, v -> split(v)[0]}), "\n")readfile('文件1')读取文件1所有行,map函数提取每行的第一个元素,join将提取结果用换行符连接后存入寄存器a。 - 接着执行替换命令,将对应行的内容追加到文件2每行开头:
命令解释::%s/^/\=getreg('a')->split("\n")[line('.')-1] . ' '/line('.')-1获取当前行的索引,从寄存器a中取出对应行的第一列内容,添加到当前行开头。
内容的提问来源于stack exchange,提问作者Kuo-Hsien Chang
相关产品推荐
相关产品推荐

