2

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

例如,对于文件名myfile0072.txt

mike   160
jane   174

myfile0072.txt mike 160
myfile0072.txt jane 174

我无权访问 Bash 或 C 或 Perl 或工作中的任何东西。我可以在 Vim 中做些什么来获得这个结果吗?

4

4 回答 4

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

编辑结束


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

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

解释:

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

%s/FROM/TO/用 TO 替换 FROM

^是行首(因此替换将 TO 添加到行首)

\=意味着 TO 应该是表达式的结果

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

. ' '附加一个空格。

|是命令加入字符,所以在替换之后,它运行:

w,它将文件写入磁盘。

于 2009-09-22T10:13:36.707 回答
2

怎么样

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

在当前文件的每一行的开头插入文件名。要在许多文件上运行它,请查看argdoor bufdo

于 2009-09-22T08:03:47.217 回答
1

最简单的选择是

:%s:^:myfile0072.txt:

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

但是对于 700 个文件,这似乎很乏味。我想知道您的评论“我没有 bash”。您必须有某种外壳,否则您无法启动 vi。

于 2009-09-22T08:09:19.407 回答
0

我按照 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 个文件。

感谢大家的帮助!

于 2009-09-23T00:21:50.210 回答