Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Search 你能批量编辑grep中返回的所有文件吗?_Search_Vim_Command Line_Sed_Grep - Fatal编程技术网

Search 你能批量编辑grep中返回的所有文件吗?

Search 你能批量编辑grep中返回的所有文件吗?,search,vim,command-line,sed,grep,Search,Vim,Command Line,Sed,Grep,我想批量编辑在grep中返回的大量文件。(我知道,我应该在sed方面做得更好) 因此,如果我这样做: grep -rnI 'xg_icon-*' 如何将所有这些文件导入vi?最简单的方法是让grep只返回与模式匹配的文件名(-l),而不是-n)。在子shell中运行,并将结果提供给Vim vim $(grep -rIl 'xg_icon-*' *) 一个很好的通用解决方案是使用xargs将标准输出从grep之类的进程转换为参数列表 A洛杉矶: 如果您想要编辑的内容在所有文件中都是相似的,那么

我想批量编辑在grep中返回的大量文件。(我知道,我应该在sed方面做得更好)

因此,如果我这样做:

grep -rnI 'xg_icon-*'

如何将所有这些文件导入vi?

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

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

一个很好的通用解决方案是使用xargs将标准输出从grep之类的进程转换为参数列表

A洛杉矶:


如果您想要编辑的内容在所有文件中都是相似的,那么使用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

如果您使用vim和-p选项,它将在一个选项卡中打开每个文件,您可以使用gt或gt在它们之间切换,甚至可以使用鼠标(如果您在终端中有鼠标支持)

您可以在不处理grep输出的情况下进行切换!这甚至可以让您转到正确的行(使用
:help quickfix
命令,例如
:cn
:cw
)。因此,如果您使用的是bash或zsh:

vim -q <(grep foo *.c) vim-q<(grep foo*.c)
但是vi不是一次只打开一个文件吗?不。你可以一次打开多个文件。命令:next和:prev将在参数列表中循环。使用实际的vi,您必须在更改文件之前进行保存。使用Vim,您可以“:set hidden”更改缓冲区,而无需先保存,但如果您试图退出未保存的更改,仍然会收到警告。另外,Vim有:bnext和:bprev命令来遍历缓冲区列表,缓冲区列表是参数列表的超集,你可以使用BufExplorer vim插件来查看你打开了哪些缓冲区,并在它们之间快速切换。还要注意的是,当标准输入来自管道时,vim不喜欢它,所以上面的方法比“grep-rIl…”要好得多当您使用
vim-
@Kaleb-vim调用标准输入时,vim对标准输入感到满意。当它来自管道时,它工作得非常好。在这种情况下,不要忘记打电话给xargs。当管道用内容而不是文件名填充vim时,付费的书呆子回答你的话:不要忘记破折号。通常在
grep…
给我正确的结果后,我会做
vi$(!!-l)
。可能适用于所有现代Bash,但如果我不记得在MSysGit/Cygwin上的话。这是一个救命软件。。我为什么不早点查这个?!谢谢!这个功能太棒了!这个答案对我很有帮助,尤其是因为它推广到了非
vi
的程序。(我们中的一些人不属于那个部落,但这种多样性的大多数问题都相当明确地指出了这一点。)在我的mac上(在终端中),使用vim执行此操作后,我的终端在stdin上出现了一些令人讨厌的问题。其他解决方案并非如此。人物没有明显地表现出来,等等。想法?vim-q-c copen vim -q <(grep foo *.c)
vi `grep -l -i findthisword *`