2

У меня есть простой текстовый файл с записями как

firstAuthorLastName_titleFirstWord_YYYY

что я изменяю на

firstAuthorLastNameYYYYtitleFirstWord

с помощью следующей команды s// в Vim.^ [1]

%s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)/\1\3\2/g

Но я хочу делать эту команду снова и снова. Похоже, я должен быть в состоянии сделать это с помощью пакетного сценария Windows и флаг -c для gvim.exe . Но я не могу заставить его работать.

У меня есть пакетный скрипт Windows со следующим.

gvim -c "%s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)/\1\3\2/g" herron.bib

Но я получаю сообщение E486: Pattern not found: \([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\) . Есть ли способ повторно использовать / автоматизировать эту команду s// ? Я знаю, что могу стрелять вверх по истории моей бывшей команды, но мне хотелось бы чего-то более постоянного и надежного.

[^ 1] FWIW, это файл BibTeX .bib, который я экспортирую из Zotero. В дальнейшем я использую vim-pandoc для записи заметок в уценке. Подчеркивание затрудняет использование "аккуратной" функции vim-pandoc, поэтому я удалил их. Я обновляю .bib несколько раз в неделю и реэкспортирую его из Zotero, поэтому мне также нужно запускать это регулярное выражение несколько раз в неделю.

1 ответ1

5

Я не вижу ничего плохого, и, видимо, шаблон правильно передан Vim, поэтому он должен работать :-(

альтернативы

Если вам действительно не нужны специальные возможности Vim, вам, вероятно, лучше использовать неинтерактивные инструменты, такие как sed , awk или Perl / Python / Ruby / ваш любимый язык сценариев.

Тем не менее, вы можете использовать Vim не в интерактивном режиме:

Тихий пакетный режим

Для очень простой обработки текста (т. Е. С использованием Vim, например расширенного «sed» или «awk», возможно, просто извлекающего выгоду из расширенных регулярных выражений в команде :substitute ), используйте Ex-mode.

REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"

Примечание: в пакетном режиме без вывода сообщений (:help -s-ex) портится консоль Windows, поэтому вам может потребоваться выполнить команду cls для очистки после запуска Vim.

Vim альтернативы

Исходя из вашего описания, не совсем понятно, хотите ли вы полной автоматизации или просто проще вспомнить. Если вы не возражаете против применения команды вручную (но быстро) из Vim, как насчет:

а) пользовательская команда

:command! TidyNames %s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)/\1\3\2/g

б) настраиваемое отображение

:nnoremap <Leader>tn :%s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)/\1\3\2/g<CR>

Оба они могут быть помещены в ваш ~/.vimrc или (с модификатором <buffer> ) в специфичный для типа ~/.vim/after/ftplugin/tex.vim .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .