我需要根据其内容使用vim批量编辑一堆文件。最简单的示例是,我想对文件执行一系列的替换操作,但前提是文件的第一行与特定模式匹配。
我正在尝试做这种事情:
vim -e -s $file < changes.vim
我应该补充一点,我无法使用sed和awk之类的工具,而是想在vim中执行整个操作。
我建议您找到所需文件的列表,并将该列表传递到所需的命令中。为此,将awk
和组合使用xargs
似乎很有用。您可能可以做一些更聪明的简短事情……
awk 'FNR>1 {nextfile} /pattern/ { print FILENAME ; nextfile }' filePattern | xargs -I{} vim -e -s {} < changes.vim
在上面,filePattern
给出您想要的所有文件(也许是*.c
),/pattern/
是您要查找的匹配项的正则表达式。xargs
将“每次输出一个”,并将其替换为我放置的位置的以下命令{}
。
我想为此链接打个招呼,从中找到了这个答案的灵感。
编辑-在我发布此内容后,您说您需要“仅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
我强烈建议您在一个单独的目录中执行此操作,首先使用几个文件的副本,以确保此操作确实如您所愿。我不想对一堆文件被覆盖负责(您要备份,对吗?)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句