Как я могу сделать объемный поиск и замену Perl?

Парсинг

[j for i in zip(a,b) for j in i]

в вашей голове достаточно прост, если вы помните, что пункты for и if выполнены по порядку, после последующего добавления результата:

temp = []
for i in zip(a, b):
    for j in i:
        temp.append(j)

и было бы проще, если бы оно было написано с более значимыми именами переменных:

[item for pair in zip(a, b) for item in pair]
6
задан brian d foy 28 May 2009 в 16:24
поделиться

4 ответа

Использование сингла perl liner

perl -pi -e 's/original string/new string/' filename

можно комбинировать с File :: Find , чтобы получить следующий единственный скрипт (это шаблон, который я использую для многих таких операций).

use File::Find;

# search for files down a directory hierarchy ('.' taken for this example)
find(\&wanted, ".");

sub wanted
{
    if (-f $_)
    {
        # for the files we are interested in call edit_file().
        edit_file($_);
    }
}

sub edit_file
{
    my ($filename) = @_;

    # you can re-create the one-liner above by localizing @ARGV as the list of
    # files the <> will process, and localizing $^I as the name of the backup file.
    local (@ARGV) = ($filename);
    local($^I) = '.bak';

    while (<>)
    {
        s/original string/new string/g;
    }
    continue
    {
        print;
    }
}
11
ответ дан 8 December 2019 в 17:26
поделиться

Попробуйте это

#!/usr/bin/perl -w

@files = <*>;
foreach $file (@files) {
  print $file . '\n';
}

Взгляните также на glob в Perl:

1
ответ дан 8 December 2019 в 17:26
поделиться

Я знаю, что вы можете использовать простой однострочник Perl из командной строки, где имя файла может быть одним именем файла или списком имен файлов. Вы, вероятно, могли бы объединить это с ответом bgy, чтобы получить желаемый эффект:

perl -pi -e 's/original string/new string/' filename

И я знаю, что это банально, но это очень похоже на sed, если вы можете использовать инструменты GNU:

for i in `find ./allFilesTobeReplaced`; do sed -i s/original string/new string/g $i; done
1
ответ дан 8 December 2019 в 17:26
поделиться

Вы можете сделать это с помощью параметра -i:

Просто обработайте все файлы как обычно, но включите -i.bak:

#!/usr/bin/perl -i.bak

while ( <> ) {
   s/before/after/;
   print;
}

Это должно обработать каждый файл и переименовать оригинал в original.bak И, конечно, вы можете сделать это как однострочник, как упомянул @Jamie Cook

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

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