我有一个纯文本文件,其中包含以下条目
firstAuthorLastName_titleFirstWord_YYYY
我改为
firstAuthorLastNameYYYYtitleFirstWord
在 Vim 中使用以下s//
命令。^[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] 仅供参考,这是我从中导出的 BibTeX .bib 文件佐特罗. 进一步下游我使用vim-pandoc在 markdown 中写笔记。下划线使得 vim-pandoc “tidy” 功能的使用变得有些困难,所以我删除了它们。我每周更新 .bib 几次并从 Zotero 重新导出,因此我也需要每周运行几次这个正则表达式。
答案1
我没有发现任何问题,而且显然模式已正确传递给 Vim,因此应该工作 :-(
备择方案
除非你真的需要特殊的 Vim 功能,否则你最好使用非交互式工具例如sed
,awk
或 Perl / Python / Ruby /你最喜欢的脚本语言在这里。
也就是说,你可以非交互地使用 Vim:
静默批处理模式
对于非常简单的文本处理(即使用 Vim 作为增强的“sed”或“awk”,可能只是受益于命令中增强的正则表达式:substitute
),使用防爆型。
REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"
注意:静默批处理模式(:help -s-ex
)会弄乱 Windows 控制台,因此您可能必须cls
在 Vim 运行后进行清理。
Vim 替代品
根据您的描述,您不太清楚您是想要完全自动化,还是只想更轻松地调用。如果您不介意在 Vim 中手动(但快速)应用命令,那么如何:
a) 自定义命令
:command! TidyNames %s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)/\1\3\2/g
b) 自定义映射
:nnoremap <Leader>tn :%s/\([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)/\1\3\2/g<CR>
这两者都可以放入您的 中~/.vimrc
,或者(使用<buffer>
修饰符)放入特定于文件类型的 中~/.vim/after/ftplugin/tex.vim
。