多数のテキスト ファイル (700 以上) があり、各ファイルの名前をファイル内のすべての行の先頭に入れる必要があります。
filename の例myfile0072.txt
:
mike 160
jane 174
に
myfile0072.txt mike 160
myfile0072.txt jane 174
Bash、C、Perl、または仕事で何かにアクセスできません。その結果を得るために Vim でできることはありますか?
これには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
、ファイルをディスクに書き込みます。
どうですか
:g/^/pu!%
:g/^/j
現在のファイルの各行の先頭にファイル名を挿入します。これを多数のファイルに対して実行するには、argdo
またはを調べます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 個のファイルを開いているため)
〜700個のファイルすべてを処理するために4回実行しました。
みんな助けてくれてありがとう!