我想批量编辑 grep 返回的大量文件。(我知道,我应该学会更好地使用 sed)。
如果我执行以下命令:
grep -rnI 'xg_icon-*'
我该如何将所有这些文件导入到vi中?
我想批量编辑 grep 返回的大量文件。(我知道,我应该学会更好地使用 sed)。
如果我执行以下命令:
grep -rnI 'xg_icon-*'
我该如何将所有这些文件导入到vi中?
最简单的方法是让grep仅返回匹配模式的文件名(-l
而不是-n
)。在子shell中运行它,并将结果提供给Vim。
vim $(grep -rIl 'xg_icon-*' *)
vim -
调用它时,Vim 对标准输入感到满意。 - a paid nerdgrep ...
命令得到正确的结果后,我会执行 vi $(!! -l)
命令。这在所有现代 Bash 上都可以正常工作,但据我记得在 MSysGit/Cygwin 上可能不行。 - Wernight一个不错的通用解决方案是使用xargs将像grep这样的进程的标准输出转换为参数列表。
如下:
grep -rIl 'xg_icon-*' | xargs vi
如果您使用vim和-p选项,它将在一个标签页中打开每个文件,并且您可以使用gt或gT甚至是鼠标(如果终端支持)在它们之间切换。
你可以不需要对grep输出进行任何处理就能完成任务!这甚至可以让你跳转到正确的行(使用:help quickfix
命令,例如:cn
或:cw
)。所以,如果你正在使用bash或zsh:
vim -q <(grep foo *.c)
如果你想编辑的内容在所有文件中都相似,那么手动使用vi编辑没有意义(尽管vi也可以脚本化)。假设情况是这样的,因为你从未提到你要编辑什么内容。
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 *`