我有很多文本文件(700+),我需要将每个文件的名称放到文件中每一行的开头。
示例,对于文件名myfile0072.txt
:
mike 160
jane 174
到
myfile0072.txt mike 160
myfile0072.txt jane 174
我无法访问Bash,C或Perl或其他任何工作。我可以在Vim中做些什么来获得结果吗?
答案 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
将文件名插入当前文件中每行的开头。
要在许多文件上运行此操作,请查看argdo
或bufdo
。
答案 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个文件。
感谢大家的帮助!