Многострочный инструмент поиска и замены - PullRequest
20 голосов
/ 06 ноября 2008

Я ищу инструмент для замены нескольких строк в проекте. Например:

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

с

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

Я пробовал два инструмента, которые работают для этого типа поиска и замены. Wildedit и Фактический поиск и замена Оба эти инструмента кажутся отличными, но являются условно-бесплатными. Кто-нибудь знает подобные инструменты? Что-нибудь бесплатное или пора расстаться с деньгами?

Уточнение:

в рамках проекта в данном случае означает тысячу плюс c файлов. Текстовые редакторы могут делать это только один файл за раз (Textpad, Блокнот программистов) или во всех открытых файлах (nodepad ++). Я не пробовал ни одного из других редакторов, но я предполагаю, что у них будут похожие проблемы. Пожалуйста, поправьте меня, если я ошибаюсь.

Такие инструменты, как sed & awk, являются решением, но представляют проблемы, поскольку я не пользуюсь ими регулярно, и мне нужно потратить некоторое время на то, чтобы что-то заработать, поскольку я не специалист по инструментам.

Ответ: Все это ...

Ультраредактирование может работать, но у меня уже есть редактор, и цена высока, если я просто собираюсь использовать его в качестве инструмента поиска и замены.

Sed, AWK и инструменты на основе регулярных выражений могут работать, но в некоторых случаях могут причинять боль.

Wild Edit может работать и не так дорого.

В конце концов, я решил применить свои навыки регулярных выражений.

Ответы [ 13 ]

12 голосов
/ 12 февраля 2013

Семейство IDE JetBrains: IntelliJ , RubyMine , PHPStorm и т. Д. Будут выполнять поиск и замену нескольких строк.

Выберите нужный текст и нажмите ctrl-shift-F - откроется диалоговое окно замены с выбранным текстом в качестве выражения поиска (с использованием регулярного выражения с символами новой строки, экранированными как \n)

9 голосов
/ 06 ноября 2008

Сед будет делать то, что вы хотите.

См. Раздел часто задаваемых вопросов об этом здесь http://sed.sourceforge.net/sedfaq4.html#s4.23.3

Если вам нужно сопоставить статический блок текст (который может встречаться в любом количестве раз в файле), где содержимое блока известно в заранее, тогда этот скрипт легко использовать

Sed доступен для Windows. Смотри http://gnuwin32.sourceforge.net/packages/sed.htm

4 голосов
/ 28 февраля 2009
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' {} \;

НТН

2 голосов
/ 17 июля 2017

Единственное, что работает под ключ в одном кадре - это ткач мечты .... enter image description here

1 голос
/ 01 сентября 2016

Мне запрещено комментировать, но в принятом решении приведен пример, который кажется ошибочным. Строка 18 должна быть:

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

Не

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

Последний будет жаловаться современному sed (или 'gsed', если вы находитесь в * BSD) на неопределенное выражение в строке 18.

1 голос
/ 12 февраля 2009

Лучший инструмент, который я нашел, это бесплатная программа под названием BK ReplaceEm . К интерфейсу нужно привыкнуть, но стоит научиться им пользоваться. Этот инструмент очень мощный и позволяет выполнять многострочные замены с регулярными выражениями или без них.

1 голос
/ 06 ноября 2008

RegexSearch немного уродлив, но очень полезен для подобных вещей.

0 голосов
/ 26 ноября 2011

Я успешно использовал Multiple Find And Replace 1.10, бесплатную программу, которая делает это: ищет несколько строк в TXT или списке TXT и заменяет их другим текстом по вашему желанию или удаляет их. Я нашел это здесь для загрузки: http://www.softpedia.com/get/System/File-Management/Multiple-Find-And-Replace.shtml

0 голосов
/ 28 февраля 2009
#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
0 голосов
/ 07 ноября 2008

Для платформы Windows я могу поддержать предложение UltraEdit-32, приведенное выше - это замечательный инструмент, который стоит своих денег. Кроме того, я думаю, что вашей лучшей ставкой будет либо небольшой скрипт на Perl, либо awk / sed, как уже упоминалось выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...