Мне нужно отредактировать файл на месте в пределах сценарий perl, поэтому часто использовался один лайнер:
perl -p -e s/<value>/<value>/ig
не сработает в этой ситуации. Как мне получить такие же результаты из сценария Perl?
open(CRONTAB, "+<file" || die "...";
while (<CRONTAB>) {
if ($_ =~ /value/) {
s/^\#+//;
print "$_\n";
}
}
Моя печать показывает именно то, что я хочу. Я ищу просто редактирование на месте.
do {
local $^I='.bak'; # see perlvar(1)
local @ARGV=("file");
while(<>){
s/<value>/<value>/ig;
print;
}
};
Однако будьте осторожны: $^I
как у Perl -i
не защищен от сбоев.
Ваше редактирование кажется довольно простым. Вы рассматривали возможность просто использовать sed с параметром -i?
Попробуйте это, основываясь на переводе -i
в Perldoc Perlrun:
use strict;
use warnings;
my $filename = "something";
my $extension = '.orig';
while (<>) {
my $backup;
if ($extension !~ /\*/) {
$backup = $filename . $extension;
}
else {
($backup = $extension) =~ s/\*/$filename/g;
}
rename $filename, $backup;
open my $outfile, '>', $filename;
select $outfile;
s/^\#+// if /value/;
}
continue {
print; # this prints to original filename
}
select STDOUT;
использовать File :: Inplace
Кроме того, у него есть фиксация / откат после того, как вы внесете все свои изменения в файл ....