【问题标题】:Multi line search and replace tool [closed]多行搜索和替换工具[关闭]
【发布时间】:2010-09-21 01:10:37
【问题描述】:

我正在寻找一种工具来替换整个项目中的多行。例如:

#include "../DiscreteIO/Discrete.h"
#include "../PCI/pci.h"
#include "../Arinc429/ARINC429.h"

#include "../PCI/pci.h"
#include "../DiscreteIO/DiscreteHW.h"
#include "../DiscreteIO/Discrete.h"

我尝试了两种适用于此类搜索和替换的工具。 WildeditActual search and replace 两者似乎都是优秀的工具,但却是共享软件。有人知道类似的工具吗?有什么免费的,还是该花点钱了?

澄清:

通过一个项目在这种情况下意味着一千多个 c 文件。文本编辑器一次只能执行一个文件(Textpad、Programmers notepad)或所有打开的文件(nodepad++)。我没有尝试过任何其他编辑器,但我认为他们会遇到类似的问题。如果我错了,请纠正我。

像 sed 和 awk 这样的工具是一种解决方案,但存在一些问题,因为我不经常使用它们,并且由于我不是这些工具方面的专家,因此需要花一些时间才能开始工作。

答案是:全部...

超编辑可以工作,但我已经有一个编辑器,如果我只是将它用作搜索和替换工具,价格会很高。

基于 Sed、AWK 和正则表达式的工具可以工作,但在某些情况下可能会很麻烦。

Wild Edit 可以工作,而且不贵。

我最终的决定是发挥我的正则表达式技能。

【问题讨论】:

  • 类似问题here
  • 正如我在答案中链接到的教程中所示,UltraEdit 可以处理数千个文件,而不是在编辑器中打开。
  • 如果您总是需要将这些文件放在一起,按需要的顺序创建一个包含所需内容的单个标头不是更好吗?如果标题可以按任何顺序包含,那将是最好的 - 每个都应该是self-contained and idempotent。我也建议去掉 ../ 符号。

标签: search


【解决方案1】:

JetBrains 系列 IDE:IntelliJRubyMinePHPStorm 等将进行多行搜索和替换。

选择有问题的文本并按ctrl-shift-F -- 这将打开替换对话框,其中所选文本作为查找表达式(使用正则表达式,换行符转义为\n

【讨论】:

    【解决方案2】:

    sed 会做你想做的事。

    在此处查看有关此问题的常见问题解答条目http://sed.sourceforge.net/sedfaq4.html#s4.23.3

    如果你需要匹配一个静态块 文本(可能出现任意数量的 整个文件的时间),其中 块的内容是已知的 提前,那么这个脚本很容易 使用

    Sed 可用于 Windows。见http://gnuwin32.sourceforge.net/packages/sed.htm

    【讨论】:

    • 不确定我做错了什么,但是当我运行sed -nf blockrep.sed findrep.txt 命令生成custom.sed 文件时,我收到错误sed: file blockrep.sed line 18: unterminated 's' command。查看该行 (s,[/\[.*],\\&,g) 上的正则表达式对我来说似乎是正确的。
    • 只需编辑文件并将第二个[ 移动到第 18 行的 ] 旁边:s,[/\[.*],\\&,g -> s,[/\.*[],\\&,g [[] 组内的字符必须位于关闭标记旁边] ] 是相反的,必须靠近打开标签 [sed-users.yahoogroups.narkive.com/dKa8Aba3/…
    【解决方案3】:
    cd $PROJECTDIR && find . -iname '*.*' -exec vim -c 's:^first line of text\nsecond line of text\n3rd line of text:new 1st line\rnew 2nd\rnew 3rd:' -c 'w!' -c 'q' {} \;
    

    HTH

    【讨论】:

    • 稍微解释一下会有很大帮助。
    【解决方案4】:

    Visual Studio Code 具有非常出色的“全局”搜索和替换功能。我只是将它用于多个文件的多个多行更改,包括一些带有捕获和替换的正则表达式搜索。

    • 打开 VS 代码
    • 文件→打开文件夹,打开你的文件所在的文件夹
    • 打开文件并选择要替换的文本
    • CTRL + SHIFT + H 打开搜索和替换
    • 如果您选择了一个文本,它将自动填充,甚至是多行。否则输入文本,使用 SHIFT + Enter 插入换行符,并可选择启用正则表达式。
    • 输入替换文本
    • 按 Enter 开始搜索
    • 单击更改项以并排预览更改
    • 使用全部替换按钮 (CTRL + ALT + Enter) 应用并保存更改

    【讨论】:

      【解决方案5】:

      只有 Dreamweaver 可以一次性完成交钥匙工程......

      【讨论】:

        【解决方案6】:

        我成功地使用了 Multiple Find And Replace 1.10,这是一个免费软件程序,它可以做到这一点:在 TXT 或 TXT 列表中搜索多行,并根据需要将它们替换为其他文本或删除它们。我在这里找到它供下载:http://www.softpedia.com/get/System/File-Management/Multiple-Find-And-Replace.shtml

        【讨论】:

        • 另一个过时的答案...
        【解决方案7】:

        我无权发表评论,但接受的解决方案引用了一个似乎被破坏的示例。第 18 行应该是:

        s,[/\.*[],\\&,g
        

        没有

        s,[/\[.*],\\&,g
        

        后者将向现代 sed(如果您在 *BSD 中,则为“gsed”)抱怨第 18 行的未终止表达式。

        【讨论】:

          【解决方案8】:

          RegexSearch 有点难看,但对于这类事情来说是一个非常有用的工具。

          【讨论】:

          • 我无法使用它递归替换给定类型的所有文件。似乎不支持递归。
          【解决方案9】:

          我发现的最好的工具是一款名为BK ReplaceEm 的免费软件。该界面需要一些时间来适应,但值得学习如何使用它。该工具非常强大,允许您使用或不使用正则表达式进行多行替换。

          【讨论】:

            【解决方案10】:

            Ultraedit 可以做到这一点。我为此付出了金钱。

            a tutorial on multi-line find & replace 可以与“replace in files”一起使用以应用于多个文件。

            【讨论】:

              【解决方案11】:

              我很确定 sed、awk 和/或 grep 的组合可以完成这项工作。它们是免费的,随任何 Linux 发行版一起提供,但也存在 Windows 版本。

              【讨论】:

                【解决方案12】:

                当人们要求工具时我总是感到困惑,而没有告诉他们需要哪些平台...在这些情况下,我想默认情况下是 Windows...

                有许多可用于 Windows 的搜索/替换工具,或多或少功能强大,其中很多是免费的。
                目前,我使用FileMenu Tools 的搜索/替换模块,功能非常强大(您可以使用正则表达式),还有很多其他好东西。
                我还有 RJL Soft 的 Simple Search-Replace(无 RE),TortoiseSVN 作者的 grepWin,支持正则表达式和大量选项,还有一些我过去使用过的选项。

                PS.:我忘了。 Simple Search-Replace 不会进行多行替换。显然,两者都不是 FileMenu 工具。 grepWin 可以(例如使用 \r\n )。 我确实记得这些带有多行搜索/替换字段的免费工具,但我手头没有它们的名字。

                【讨论】:

                • 另一个过时的答案...链接需要更新。一个跨平台的解决方案会很好
                • @Sharcoux 链接?只有 FileMenu Tools 一个会导致 404 页面,如果你在 URL 中上两层,你会找到产品!我称之为懒惰...跨平台:尝试 sed...
                • 文件菜单工具已过时。 sed 在多行方面远非用户友好。简单搜索替换不支持多行。所以,也许 grepWin 可以回答这个问题。我承认我没有尝试过。如果您只将 grepWin 用于您的答案,我将删除我的反对票
                【解决方案13】:
                #see docs at the bottom 
                use strict;
                use warnings;
                use Cwd;
                
                use File::Find;
                
                my $search_patternFilePath=$ARGV[0] ;
                my $replace_patternFilePath =$ARGV[1];
                my $file_pattern = $ARGV[2];
                
                # Usage
                
                (@ARGV == 3 ) || die ("Usage: FindAndReplace.pl pathToFileContaingTheMultiLineSearchText FullPathToFileContainingMultiLineReplaceText FilePattern . Example: perl MultiLineFindAndReplace.pl \"D:\Opera\New Folder\search.txt\" \"D:\Opera\replace.txt\" bak");
                
                
                
                find(\&d, cwd);
                
                sub d {
                my $file = $File::Find::name;
                $file =~ s,/,\\,g;
                
                return unless -f $file;
                return unless $file =~ /$file_pattern/;
                
                my $searchPatternString = &slurpFile ( $search_patternFilePath ) ; 
                my $replacePatternString = &slurpFile ( $replace_patternFilePath ) ; 
                my $fileStr = &slurpFile ( $file ) ; 
                
                $fileStr =~ s/$searchPatternString/$replacePatternString/igo ; 
                open(FILEHANDLE,">$file") || die "cannot open output file";
                print (FILEHANDLE "$fileStr");
                close FILEHANDLE ;
                
                }
                
                sub slurpFile 
                {
                my $file = shift ;
                print "\$file is $file" ;
                local( $/, *FILE ) ; 
                open (FILE , $file) or 
                die "Cannot find $file !!! " ; 
                my $fileString = <FILE>; #slurp the whole file into one string !!! 
                close FILE ;
                return $fileString ;
                }
                #Purpose : performs recursive find and replace based on pеrl regexes from the current directory
                #the search and replace is case insensitive
                #Usage
                #perl MultiLineFindAndReplace.pl "D:\Opera\New Folder\search.txt" "D:\Opera\replace.txt" bak
                

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2011-07-08
                  • 2021-01-31
                  • 1970-01-01
                  • 2021-09-20
                  • 2019-12-23
                  • 2016-01-31
                  • 2018-05-16
                  相关资源
                  最近更新 更多