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

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

我有一个纯文本文件,其中包含以下条目

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 功能,否则你最好使用非交互式工具例如sedawk或 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

相关内容