使用Vim将文件名转换为文件

时间:2009-09-22 07:43:30

标签: insert vim filenames

我有很多文本文件(700+),我需要将每个文件的名称放到文件中每一行的开头。

示例,对于文件名myfile0072.txt

mike   160
jane   174

myfile0072.txt mike 160
myfile0072.txt jane 174

我无法访问Bash,C或Perl或其他任何工作。我可以在Vim中做些什么来获得结果吗?

4 个答案:

答案 0 :(得分:7)

这有两个阶段,首先将要编辑的所有文件都放到参数列表中,然后将文件名添加到行中。

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')

END OF EDIT


2)对所有文件进行必要的过滤:

:argdo %s/^/\=expand('%:t') . ' '/ | w

说明:

argdo 对参数列表中的每个文件运行命令。

%s/FROM/TO/ 将TO替换为TO

^ 是该行的开头(因此替换将TO添加到行的开头)

\= 表示TO应该是表达式的结果

expand('%:t') 给出当前文件的名称(%),仅包括尾部(':t'),因此没有前导目录名。

. ' ' 附加一个空格。

| 是加入字符的命令,因此在替换后运行:

w ,将文件写入磁盘。

答案 1 :(得分:2)

怎么样

:g/^/pu!%
:g/^/j

将文件名插入当前文件中每行的开头。 要在许多文件上运行此操作,请查看argdobufdo

答案 2 :(得分:1)

最简单的选择是

:%s:^:myfile0072.txt:

说明:::命令,%:对于每一行,s:^:xxx::将“行首”替换为“xxx”。不过,我不知道你有某种变量替换。但您可以使用<Ctrl-R>%(扩展为当前文件名)。

但对于700个文件,这似乎非常繁琐。我想知道你的评论“我没有打击”。你必须有某种shell或者你无法启动vi。

答案 3 :(得分:0)

我跟jleedev建议一样,因为我最熟悉

:g/^/pu!%
:g/^/j

出于某种原因,在vim中打开多个文件时,pu!%也使目录结构也进入文件。没什么大不了的。

我使用相同的vim实例打开了200个文件然后执行了此操作...

qm

'q'开始录制名为'm的宏。

:g/^/pu!% 
:g/^/j 
:%s/blahhh/blahhhhhh 
:w 
:bn 

blahh stuff用空格替换目录,:w保存文件,然后:bn移动到下一个文件

q

q结束宏

200@m

200 @ m表示重复宏200次(因为我打开了200个文件)

我只做了4次来完成所有~700个文件。

感谢大家的帮助!