【问题标题】:Great tools to find and replace in files? [closed]在文件中查找和替换的好工具? [关闭]
【发布时间】:2011-01-22 19:59:57
【问题描述】:

我正在从 Windows PHP 特定的编辑器切换到 VIM,其理念是“使用一个编辑器处理所有事情,并且学习得很好。”

然而,我喜欢我的 PHP 编辑器的一个特性是它的“查找和替换”功能。我可以通过两种方式处理事情:

  • 只要找到。在项目中的所有文件中搜索字符串,查看列出的所有匹配项,然后单击以深入了解该文件的该行。
  • 将所有出现的“foo”替换为“bar”。

当然,我可以使用 GUI 来说明文件的类型、是否查看子文件夹、是否区分大小写等。

我现在正在尝试近似此功能,并且尝试将其与 bash 拼凑起来非常乏味。可行,但乏味。

有没有人知道任何适用于 Linux 和/或 Windows 的出色工具? (如果可能的话,我真的更喜欢 GUI。)还是失败了,一个 bash 脚本可以很好地完成这项工作? (如果它会列出文件名和行号并显示代码 sn-ps,那就太好了。)

【问题讨论】:

  • 如果你想使用 GUI,我会认真考虑不使用 vim,因为它是一个非常面向命令行的工具。像 eclipse 或 visual studio 这样的东西可能更适合您的用例。
  • @Seamus - 我已经喜欢 vim - 能够仅使用键盘快速工作非常棒。但我使用的大多数命令都是一两次击键。如果我可以在 bash 或 vim 中使用一个简短易记的命令来执行此操作,那就没问题了。我只是不想每次想在所有文件中找到foo_function() 时都编写一个长长的 bash 程序。
  • 所以您可以在 vim 之外运行一些命令,或者您正在寻找可以在 vim 内部运行的插件之类的东西?
  • 我找到了这个插件vim.org/scripts/script.php?script_id=69 也许它就是你需要的。我自己没有测试过。

标签: windows linux bash vim replace


【解决方案1】:

试试 sed。例如:

sed -i -e 's/foo/bar/g' myfile.txt

【讨论】:

  • 还有:查找 . -name "*.php" | xargs sed -i -e 's/foo/bar/g'
  • 诅咒......你打败了我! ;)
  • 康拉德:我做了一个小调整:find . -name "*.txt" | xargs sed -i '' -e's/fo0/bar/g'。我提供了'' 作为i 的参数,意思是“不要创建备份文件”。我不在乎,因为我的项目处于版本控制之下,所以备份文件会很混乱,git 会告诉我发生了什么变化。
【解决方案2】:

Vim 使用命令 :vimgrep(或 :grep 使用外部 grep 程序 - 这是 Vim 7 之前的唯一选项)内置了多文件搜索。

:vimgrep 将在文件中搜索正则表达式并将匹配列表加载到缓冲区中 - 然后您可以在缓冲区中直观地导航结果列表或使用 :cnext:cprev 命令。它还支持使用 ** 通配符搜索目录树。例如

:vimgrep "^Foo.*Bar" **/*.txt

在当前目录下的任何 .txt 文件中搜索以 Foo 开头并包含 Bar 的行。

:vimgrep 使用“快速修复”缓冲区来存储其结果。还有 :lvimgrep 使用特定于您正在使用的窗口的本地缓冲区。

Vim 不支持开箱即用的多文件替换,但 vim.org 上也有插件可以做到这一点。

【讨论】:

  • YES - 最好的部分是,一旦找到所有匹配项,您可以键入 :copen 在底部的窗口中查看它们,然后突出显示一个并按 Enter 键跳转到该文件。(您也可以使用 :cn 和 :cp 在多个文件中的匹配项之间循环)
  • 另外 - 结果列表显示了行号和代码 sn-ps,正如我所要求的。从搜索结果移动到编辑窗口,就像 vim 中的任何两个窗口一样(如使用 :split 时) - ctl-w 和一个方向。我对此感到非常兴奋!
【解决方案3】:

我不明白为什么你不能用 VIM 做到这一点。

只要找到

/Foo

突出显示文件中 Foo 的所有实例,您可以为所欲为。

盲目更换

:% s/Foo/Bar/g

显然,这只是冰山一角。您的搜索范围具有很大的灵活性,并且对您的术语有完整的正则表达式支持。它可能与您以前的编辑器不完全一样,但我认为您最初的“使用一个编辑器”的想法是有效的。

【讨论】:

  • Vim 可以很好地进行搜索和替换,但不能跨多个文件。 sed 可能是为此选择的工具。
  • 您可能必须执行:set hlsearch 才能打开所有实例突出显示。
  • @Jay:VIM 原生支持多种 grep 风格,可以实现多文件搜索。见vim.wikia.com/wiki/Find_in_files_within_Vim
  • @Jay:Vim 确实支持使用 args 和 argdo 很好地搜索和替换多个文件。例如::args *.[ch] :argdo %s/TODO/DONE_NOW/ge |更新这将在所有 *.c *.h 文件中用 DONE_NOW 替换 TODO。另请参阅 :bufdo 和 :windo
  • 谢谢!我在 vi 上咬牙切齿 - vim 似乎添加了一些不错的功能。
【解决方案4】:

Notepad++ 允许我在整个文件夹(和子文件夹)中搜索和替换,并支持正则表达式。

【讨论】:

    【解决方案5】:

    您可以在命令提示符中使用 perl 来替换文件中的文本。

    perl -p -i".backup" -e "s/foo/bar/g" test.txt
    

    【讨论】:

    • perl -pi -e 's/foo/bar/g' file 。 *nix 系统上不需要".backup"
    【解决方案6】:

    由于您正在寻找GUI工具,我一般使用以下2个工具。它们都具有强大的功能,包括通配符匹配、正则表达式、文件类型过滤器等。它们都在文件名/行等文件中显示了有关命中的有用信息。

    1. Visual Studio:快速而强大。如果文件数量很大(例如,数万...),我会使用它

    2. pspad:轻量级。而pspad的find/replace的一个很好的特性是它会在树的层次结构中将不同文件中的hit组织起来,这一点非常清晰。

    【讨论】:

      【解决方案7】:

      您可以使用许多工具让事情变得更简单。首先,要从 vim 中搜索项目中的所有文件,您可以使用 :grep,如下所示:

      :grep 'Function1' myproject/
      

      这实质上是运行一个 grep 并让您快速从/到它已找到的位置跳转。

      Ctags 是一个工具,它可以在你的代码中找到声明,然后允许 vim 跳转到这些声明。为此,请运行 ctags,然后将光标放在函数调用上,然后使用 Ctrl-]。这是一个包含更多 ctags 信息的链接:

      http://www.davedevelopment.co.uk/2006/03/13/vim-ctags-and-php-5/

      【讨论】:

        【解决方案8】:

        我不知道这是否适合您,但如果您将所有文件加载到 vim 中 vim *.php 比你还可以

        :set hidden

        :argdo %s/foo/bar/g => 将在所有打开的缓冲区中执行替换命令

        :wall => 将写入所有打开的缓冲区

        或者不要将所有文件加载到 vim 中,而是尝试 :help vimgrep 以及 :help argdo:help argadd 的组合

        【讨论】:

          【解决方案9】:

          对于 Windows,我认为 grepWin 很难被击败 - 一个强大且灵活的 Windows grep 工具的 GUI。它搜索、替换、了解正则表达式之类的东西。

          【讨论】:

            【解决方案10】:

            查看 sed ... 强大的命令行工具,应该可以完成您正在寻找的大部分内容...它支持正则表达式,因此您的查找/替换非常容易。 (人 sed)

            【讨论】:

              【解决方案11】:

              Notepad++ 支持多种语言的语法高亮显示,并支持使用regex and basic \n \r \t support 在所有打开的文件中查找和替换。

              【讨论】:

                【解决方案12】:

                命令grep -rn "search terms" * 将在所有文件(包括子目录中的文件)中搜索指定的术语,并返回匹配的行,包括文件名和行号。有了这些信息,就可以轻松跳转到 VIM 中的特定文件/行。

                如前所述,sed 在查找和替换方面非常强大。

                您也可以在 VIM 中运行这两个工具。

                【讨论】:

                  【解决方案13】:

                  我目前合作的一些开发人员发誓Textpad。它有一个用户界面,还支持使用正则表达式——你正在寻找的一切等等。

                  【讨论】:

                    【解决方案14】:

                    一个非常有用的搜索工具是ack。 (Ubuntu 在存储库和手册页中将其称为“ack-grep”。)

                    它所做的简短版本是findgrep 的组合,比这对组合更强大、更智能。

                    【讨论】:

                      猜你喜欢
                      • 2011-10-20
                      • 1970-01-01
                      • 1970-01-01
                      • 2011-07-18
                      • 2014-07-26
                      • 2012-05-13
                      • 2020-08-22
                      • 2013-08-27
                      相关资源
                      最近更新 更多