Многострочная поисковая замена Perl

В некоторых базовых оболочках отсутствуют команды типа «найти», а некоторые из них не поддерживают рекурсивность. В этом случае вы можете использовать этот скрипт для запуска нужной команды во всех подкаталогах дерева:

CDIR=$(pwd)
for i in $(ls -R | grep :); do
    DIR=${i%:}                    # Strip ':'
    cd $DIR
    $1                            # Your command
    cd $CDIR
done

Если вы назвали вышеупомянутый «recurse.sh», тогда используйте:

./recurse.sh <command>

Пример (изменить владельца / группу на «корень» всех файлов в дереве):

./recurse.sh "chown 0:0 *"
56
задан user44556 23 June 2009 в 05:43
поделиться

2 ответа

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

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 [extension].

91
ответ дан 26 November 2019 в 17:12
поделиться

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

local $/ = undef;

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

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

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

2
ответ дан 26 November 2019 в 17:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: