2

多数のテキスト ファイル (700 以上) があり、各ファイルの名前をファイル内のすべての行の先頭に入れる必要があります。

filename の例myfile0072.txt:

mike   160
jane   174

myfile0072.txt mike 160
myfile0072.txt jane 174

Bash、C、Perl、または仕事で何かにアクセスできません。その結果を得るために Vim でできることはありますか?

4

4 に答える 4

7

これには2つの段階があります。まず、編集するすべてのファイルを引数リストに入れてから、ファイル名を行に追加します。

1)引数リストにファイルを追加します。

「gvim*.txt」でvimを起動するか(シェルがコマンドラインにリストされている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/FROMをTOに置き換えます

^は行の先頭です(したがって、置換により行の先頭にTOが追加されます)

\=TOは式の結果でなければならないことを意味します

expand('%:t')現在のファイルの名前(%)を示します。末尾(':t')のみが含まれるため、先頭のディレクトリ名はありません。

. ' 'スペースを追加します。

|はコマンド結合文字であるため、置換後、次のように実行されます。

w、ファイルをディスクに書き込みます。

于 2009-09-22T10:13:36.707 に答える
2

どうですか

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

現在のファイルの各行の先頭にファイル名を挿入します。これを多数のファイルに対して実行するには、argdoまたはを調べます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 個のファイルを開いているため)

〜700個のファイルすべてを処理するために4回実行しました。

みんな助けてくれてありがとう!

于 2009-09-23T00:21:50.210 に答える