我建议您找到您需要的文件列表,并将该列表传递给您想要的命令。为此,awk 和 xargs 的组合似乎很有用。您可能可以做一些更聪明的更短的事情……
awk 'FNR>1 {nextfile} /pattern/ { print FILENAME ; nextfile }' filePattern | xargs -I{} vim -e -s {} < changes.vim
在上面,filePattern 给出了你想要的所有文件(可能是*.c),/pattern/ 是你正在寻找的匹配的正则表达式。 xargs 将“一次输出一个”并将其替换为我放置 {} 的位置的以下命令。
我想向this link 提个醒,我在此找到了这个答案的灵感。
vim 唯一解决方案
编辑 - 在我发布后你说你需要一个“仅 vim”的解决方案。在这里……
第 1 步:创建一个 conditionalEdits.vim 文件,开头包含以下几行:
let line_num = search('searchExpression') " any regex
if line_num == 1 " first line matched
center " put your editing commands here...
update " save changes
endif
quit
当然,您需要将所有编辑命令放在if 语句中,而不是仅仅将第一行居中。
现在,你执行这个命令
vim -c '/path/to/my/conditionalEdits.vim' -s filePattern
filePattern 与您可能感兴趣的所有文件匹配(但您在查看了里面的第 1 行之后肯定会知道......)
显然,您可以以通常的方式浏览文件并查找匹配/模式等内容,但这是基本的想法。
有用的链接:http://www.ibm.com/developerworks/library/l-vim-script-1/
和http://learnvimscriptthehardway.stevelosh.com
我强烈建议您在单独的目录中执行此操作,首先使用少量文件的副本,以确保它确实按照您的想法执行。我不想为一堆被覆盖的文件负责(你确实备份了,对吗?)