Многострочный поиск заменить на Perl - PullRequest
52 голосов
/ 23 июня 2009

Я знаю, что подобные вопросы задавались уже много раз прежде. Причина, по которой я прихожу сюда снова, заключается в том, что я чувствую, что упустил что-то простое и фундаментальное.

Можно ли сделать этот тип процедуры поиска-замены лучше. Например, не открывая один и тот же файл дважды. Также приветствуются советы по скорости.

Обратите внимание, что это работает с многострочными совпадениями и заменяет также многострочные строки.

#!/bin/perl -w -0777

local $/ = undef;

open INFILE, $full_file_path or die "Could not open file. $!";
$string =  <INFILE>;
close INFILE;

$string =~ s/START.*STOP/$replace_string/sm;

open OUTFILE, ">", $full_file_path or die "Could not open file. $!";
print OUTFILE ($string);
close OUTFILE;

Ответы [ 3 ]

88 голосов
/ 23 июня 2009

Этот вид поиска и замены может быть выполнен с помощью одной строки, например -

perl -i -pe 's/START.*STOP/replace_string/g' file_to_change

Чтобы узнать больше о том же, ознакомьтесь с этой нитью . Для обработки многострочного поиска используйте следующую команду -

perl -i -pe 'BEGIN{undef $/;} s/START.*STOP/replace_string/smg' file_to_change

Чтобы преобразовать следующий код из однострочной программы в perl-программу, взгляните на документацию perlrun .

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

#!/usr/bin/perl -pi
#multi-line in place substitute - subs.pl
use strict;
use warnings;

BEGIN {undef $/;}

s/START.*STOP/replace_string/smg;

Затем вы можете вызвать скрипт с именем файла в качестве первого аргумента

$perl subs.pl file_to_change

Если вам нужен более простой сценарий, в котором вы можете обрабатывать операции открытия / закрытия файлов (разве нам не нравятся все эти операторы 'die'), посмотрите на пример в perlrun под -i [расширение] переключатель.

27 голосов
/ 28 ноября 2017

Получение краткого ответа из комментариев для тех, кто ищет быстрый однострочный текст, и причина, по которой Perl игнорирует их параметры RegEx из командной строки.

perl -0pe 's/search/replace/gms' file

Без аргумента -0 Perl обрабатывает данные построчно , что приводит к сбою многострочного поиска.

2 голосов
/ 23 июня 2009

Учитывая, что вы выпилите все содержимое файла с помощью:

local $/ = undef;

open INFILE, $full_file_path or die "Could not open file. $!";
$string =  <INFILE>;
close INFILE;

А затем выполните всю обработку с $string, нет никакой связи между тем, как вы обрабатываете файл, и тем, как вы обрабатываете содержимое. У вас возникнет проблема, если вы откроете файл для записи до того, как закончите его читать, поскольку открытие файла для записи создает новый файл, отбрасывая предыдущее содержимое.

Если все, что вы пытаетесь сделать, это сохранить в операторах открытия / закрытия, то поступите так, как Джонатан Леффер предложил . Если ваш вопрос касается многострочного поиска и замены, уточните, в чем проблема.

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