Парсинг
[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]
Использование сингла 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;
}
}
Попробуйте это
#!/usr/bin/perl -w
@files = <*>;
foreach $file (@files) {
print $file . '\n';
}
Взгляните также на glob в Perl:
Я знаю, что вы можете использовать простой однострочник 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
Вы можете сделать это с помощью параметра -i:
Просто обработайте все файлы как обычно, но включите -i.bak:
#!/usr/bin/perl -i.bak
while ( <> ) {
s/before/after/;
print;
}
Это должно обработать каждый файл и переименовать оригинал в original.bak И, конечно, вы можете сделать это как однострочник, как упомянул @Jamie Cook