Использование Vim для получения имени файла в файлы - PullRequest
2 голосов
/ 22 сентября 2009

У меня есть несколько текстовых файлов (более 700), и мне нужно указать имя каждого файла в начале каждой строки в файле.

Пример для имени файла myfile0072.txt:

mike   160
jane   174

до

myfile0072.txt mike 160
myfile0072.txt jane 174

У меня нет доступа к Bash или C, Perl или чему-либо еще на работе.Есть ли что-то, что я могу сделать в Vim, чтобы получить такие результаты?

Ответы [ 4 ]

7 голосов
/ 22 сентября 2009

Для этого есть два этапа: сначала получить все файлы, которые вы хотите отредактировать, в список аргументов, затем добавить имя файла в строки.

1) Добавить файлы в список аргументов.

Либо начните vim с «gvim * .txt» (если ваша оболочка может обработать 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

EDIT:

Более чистый способ сделать это:

:cd /path/to/files
:exe 'args' glob('*.txt')

Конец редактирования


2) Выполнить необходимую фильтрацию для всех файлов:

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

Пояснение:

argdo запускает команду для каждого файла в списке аргументов.

%s/FROM/TO/ заменяет ОТ на TO

^ - начало строки (поэтому замена добавляет ТО к началу строки)

\= означает, что TO должно быть результатом выражения

expand('%:t') дает имя текущего файла (%), включая только хвост (': t'), поэтому имя каталога не указано.

. ' ' добавляет пробел.

| - символ присоединения к команде, поэтому после подстановки он запускается:

w, который записывает файл на диск.

2 голосов
/ 22 сентября 2009

Как насчет

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

для вставки имени файла в начале каждой строки в текущем файле. Чтобы запустить это для многих файлов, посмотрите на argdo или bufdo.

1 голос
/ 22 сентября 2009

Самый простой вариант:

:%s:^:myfile0072.txt:

Объяснение: :: команда, %: для каждой строки, s:^:xxx:: заменить "начало строки" на "xxx". Я не знаю, что у вас есть какая-то подстановка переменных, хотя. Но вы можете использовать <Ctrl-R>% (который расширяется до текущего имени файла).

Но для 700 файлов это кажется очень утомительным. Меня интересует ваш комментарий "У меня нет баш". У вас должна быть какая-то оболочка или вы не можете запустить vi.

0 голосов
/ 23 сентября 2009

Я пошел, как предложил Джлидев, так как он был мне наиболее знаком

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

По какой-то причине, когда в vim открыты несколько файлов, pu!% Заставил структуру каталогов войти и в файл. Нет, важная персона.

Я открыл 200 файлов с тем же экземпляром vim, затем сделал это ...

qm

'q', чтобы начать запись макроса с именем 'm.

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

бла-чла заменяет каталог пустым,: w сохраняет файлы и: bn переходит к следующему файлу

q

q для завершения макроса

200@m

200 @ m означает повторение макроса m 200 раз (потому что у меня было открыто 200 файлов)

Я только что сделал 4 раза, чтобы просмотреть все мои ~ 700 файлов.

Спасибо за помощь всем!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...