我有许多文本文件(700+),我需要将每个文件的名称放入文件中每一行的开头。
例如,对于文件名myfile0072.txt
:
mike 160
jane 174
到
myfile0072.txt mike 160
myfile0072.txt jane 174
我无权访问 Bash 或 C 或 Perl 或工作中的任何东西。我可以在 Vim 中做些什么来获得这个结果吗?
这有两个阶段,首先将要编辑的所有文件放入参数列表中,然后将文件名添加到行中。
1) 将文件添加到参数列表。
要么用 "gvim *.txt" 启动 vim(如果你的 shell 可以处理命令行上列出的 700 个文件),或者在没有打开文件的情况下加载 gvim(所以参数列表为空),然后:
cd /path/to/files
" Get the list of files
let filelist = glob('*.txt')
" Add files to the argument list
for file in split(filelist, '\n')
exe 'argadd ' . file
endfor
编辑:
一种更清洁的方法是:
:cd /path/to/files
:exe 'args' glob('*.txt')
编辑结束
2)对所有文件进行所需的过滤:
:argdo %s/^/\=expand('%:t') . ' '/ | w
解释:
argdo
对参数列表中的每个文件运行命令。
%s/FROM/TO/
用 TO 替换 FROM
^
是行首(因此替换将 TO 添加到行首)
\=
意味着 TO 应该是表达式的结果
expand('%:t')
给出当前文件的名称(%),只包括尾部(':t'),所以没有前导目录名。
. ' '
附加一个空格。
|
是命令加入字符,所以在替换之后,它运行:
w
,它将文件写入磁盘。
怎么样
:g/^/pu!%
:g/^/j
在当前文件的每一行的开头插入文件名。要在许多文件上运行它,请查看argdo
or bufdo
。
最简单的选择是
:%s:^:myfile0072.txt:
解释:::
命令,%
:对于每一行,s:^:xxx:
:将“行首”替换为“xxx”。不过,我不知道您有某种变量替换。但是您可以使用<Ctrl-R>%
(扩展为当前文件名)。
但是对于 700 个文件,这似乎很乏味。我想知道您的评论“我没有 bash”。您必须有某种外壳,否则您无法启动 vi。
我按照 jleedev 的建议去了,因为它对我来说最熟悉
:g/^/pu!%
:g/^/j
出于某种原因,在 vim 中打开多个文件时, pu!% 使目录结构也进入文件。没什么大不了的。
我用相同的 vim 实例打开了 200 个文件,然后这样做了......
qm
'q' 开始录制名为 'm.
:g/^/pu!%
:g/^/j
:%s/blahhh/blahhhhhh
:w
:bn
blahh 的东西用空白替换目录, :w 保存文件, :bn 移动到下一个文件
q
q 结束宏
200@m
200@m 表示重复宏 m 200 次(因为我打开了 200 个文件)
我只做了 4 次来浏览我所有的 ~700 个文件。
感谢大家的帮助!