如何在 Vim 中“重用”正则表达式查找和替换

Ric*_*ron 2 vim regex batch command-line

我有一个带有条目的纯文本文件

firstAuthorLastName_titleFirstWord_YYYY
Run Code Online (Sandbox Code Playgroud)

我改成

firstAuthorLastNameYYYYtitleFirstWord
Run Code Online (Sandbox Code Playgroud)

s//在 Vim 中使用以下命令。^[1]

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

但我想一遍又一遍地执行这个命令。看来,我应该能够与Windows批处理脚本,并在为此-c标志gvim.exe。但我无法让它工作。

我有一个包含以下内容的 Windows 批处理脚本。

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

但我收到了消息E486: Pattern not found: \([a-z]\+\)_\([a-z]\+\)_\([0-9]\{4}\)。有没有办法重用/自动化这个s//命令?我知道我可以通过我的前命令历史向上箭头,但我想要一些更持久和可靠的东西。

[^1] FWIW,这是我从Zotero导出的 BibTeX .bib 文件。再往下游,我使用vim-pandocMarkdown写笔记。下划线使使用 vim-pandoc“整洁”功能变得更加困难,因此我将其删除。我每周更新 .bib 几次并从 Zotero 重新导出它,所以我还需要每周运行几次这个正则表达式。

Ing*_*kat 5

我没有发现任何问题,显然该模式已正确传递给 Vim,因此它应该可以工作:-(

备择方案

除非你真的需要特殊的Vim的功能,你可能关闭使用更好的非交互式工具一样sedawk或Perl / Python的/ Ruby的/你最喜欢的脚本语言在这里

也就是说,您可以非交互式地使用 Vim:

静默批处理模式

对于非常简单的文本处理(即使用 Vim 就像增强的 'sed' 或 'awk',也许只是受益于:substitute命令中增强的正则表达式),使用Ex-mode

REM Windows
call vim -N -u NONE -n -es -S "commands.ex" "filespec"
Run Code Online (Sandbox Code Playgroud)

注意:静默批处理模式 ( :help -s-ex) 会弄乱 Windows 控制台,因此您可能需要cls在 Vim 运行后进行清理。

Vim 替代品

根据您的描述,您是否想要完全自动化或只是更容易回忆尚不完全清楚。如果您不介意从 Vim 中手动(但快速)应用该命令,那么如何:

a) 自定义命令

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

b) 自定义映射

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

这两个都可以放在您的~/.vimrc, 或(带有<buffer>修饰符)中特定于文件类型的~/.vim/after/ftplugin/tex.vim.