【问题标题】:Can you mass edit all files returned in a grep?您可以批量编辑 grep 中返回的所有文件吗?
【发布时间】:2010-12-15 13:06:45
【问题描述】:

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

如果我这样做:

grep -rnI 'xg_icon-*'

如何将所有这些文件通过管道传输到 vi 中?

【问题讨论】:

  • 但是vi不是一次只打开一个文件吗?
  • 没有。您可以一次打开多个文件。命令 :next 和 :prev 将在参数列表中循环。使用实际的 vi,您必须在更改文件之前保存。使用 Vim,你可以 ":set hidden" 改变缓冲区而不需要先保存,但如果你试图退出未保存的更改,仍然会收到警告。此外,Vim 有 :bnext 和 :bprev 命令来遍历缓冲区列表,它是参数列表的超集。
  • 另一件要提的事情是,如果您正在使用 vim 编辑大量文件,您可以使用 BufExplorer vim 插件之类的工具来查看您打开了哪些缓冲区并在它们之间快速滑动。

标签: search vim command-line sed grep


【解决方案1】:

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

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

【讨论】:

  • 另请注意,当标准输入来自管道时,vim 不喜欢它,所以上面比 'grep -rIl ... | vim'。
  • 当你用vim -调用标准输入时,Vim 很满意
  • @Kaleb vim 来自管道时效果很好。在这种情况下,请不要忘记对 xargs 的调用。当管道用内容而不是文件名填充 vim 时,付费书呆子回答了你的话:不要忘记破折号。
  • 通常在grep ... 给我正确的结果之后,我会执行vi $(!! -l)。可能适用于所有现代 Bash,但如果我记得不在 MSysGit/Cygwin 上。
  • 这是救命稻草。我为什么不早点查一下?!
【解决方案2】:

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

啊啦:

grep -rIl 'xg_icon-*' | xargs vi

【讨论】:

  • 对我来说非常有帮助的答案,尤其是因为它可以推广到不是vi 的程序。 (我们中的一些人不属于那个部落,但这种多样性的大多数问题都相当明确地指出了这一点。)
  • 在我的 mac(在终端中)上,使用 vim 执行此操作后,我的终端在标准输入方面遇到了一些时髦的问题。其他解决方案并非如此。字符没有明显显示,等等。想法?
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    您可以在不处理 grep 输出的情况下做到这一点!这甚至可以让你走正确的路线(使用:help quickfix 命令,例如:cn:cw)。所以,如果你使用的是 bash 或 zsh:

    vim -q &lt(grep foo *.c)

    【讨论】:

    • vim -q -c copen
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:
      vi `grep -l -i findthisword *`
      

      【讨论】:

        猜你喜欢
        • 2010-12-03
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 2017-06-30
        • 2022-11-24
        • 2017-01-22
        • 1970-01-01
        • 2023-03-20
        相关资源
        最近更新 更多