你可以批量编辑在grep中返回的所有文件?

我想批量编辑一大堆在grep中返回的文件。 (我知道,我应该在sed上更好)。

所以如果我这样做:

grep -rnI 'xg_icon-*' 

我如何将所有这些文件转换为vi?

最简单的方法是让grep只返回匹配模式的文件名( -l而不是-n )。 在一个子shell中运行,并将结果提供给Vim。

 vim $(grep -rIl 'xg_icon-*' *) 

一个很好的通用解决scheme就是使用xargs将一个类似于grep的进程的stdout转换为一个参数列表。

阿拉:

 grep -rIl 'xg_icon-*' | xargs vi 

如果你使用vim和-p选项,它会在一个标签页中打开每个文件,你可以使用gt或者gT在它们之间切换,或者如果你在terminal里有鼠标支持

你可以做任何处理的grep输出! 这甚至可以让你去正确的路线(使用:help quickfix命令,例如:cn:cw )。 所以,如果你使用bash或者zsh:

 vim -q <(grep foo * .c)

如果你想要编辑的文件在所有文件中是相似的,那么使用vi手动执行它就没有意义了。 (尽pipevi也可以编写脚本),假设它看起来像这样,因为你从来没有提到你想编辑的东西

 grep -rnI 'xg_icon-*' | while read FILE do sed -i.bak 's/old/new/g' $FILE # (or other editing commands, eg awk... ) done 
 vi `grep -l -i findthisword *`