Es ist wie Sie Magie Bearbeitung wollen in-place aussieht. Der einfachste Weg, dies zu bekommen, ist $^I
mit der Magie der @ARGV
zu verwenden und <>
(suchen Sie nach null Dateikennung in den I/O Operators section):
#!/usr/bin/perl
use strict;
use warnings;
my $find = qr/\s{6}seqfile\s=\sinfile/;
my $replace = ' seqfile = infil2';
@ARGV = ("/home/shubhi/Desktop/pamlrun/test");
$^I = ".bak"; #safe the old files as file.bak
while (<>) {
s/$find/$replace/g;
print;
}
, auch die Art Ihrer regex gegeben, es sieht aus wie Sie wahrscheinlich [ ]
wollen (passen Sie ein Leerzeichen an) oder \t
(entsprechen einem Tab) nicht \s
. \s
passt Tabulatoren, Leerzeichen und andere Leerzeichen an.
Sie können auch Tie::File
verwenden, aber es scheint nicht, eine Backup-Funktion zur Verfügung zu stellen:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
my $find = qr/\s{6}seqfile\s=\sinfile/;
my $replace = ' seqfile = infil2';
tie my @lines, "Tie::File", "testdata"
or die "could not open file: $!";
for my $line (@lines) {
$line =~ s/$find/$replace/g;
}
Natürlich können Sie Ihre eigenen Backups mit File::Copy
rollen könnte:
#!/usr/bin/perl
use strict;
use warnings;
use Tie::File;
use File::Copy;
my $find = qr/\s{6}seqfile\s=\sinfile/;
my $replace = ' seqfile = infil2';
copy "testdata", "testdata.bak"
or die "could not backup file: $!";
tie my @lines, "Tie::File", "testdata"
or die "could not open file: $!";
for my $line (@lines) {
$line =~ s/$find/$replace/g;
}
Ich wäre auch nachlässig, wenn ich nicht darauf hingewiesen hätte, dass dies im Grunde ein Einzeiler ist:
perl -pi.bak -e 's/\s{6}seqfile\s=\sinfile/ seqfile = infil2/' testdata
Dies kann mit Perl 5.10 verkürzt wird weiter durch die Nutzung von \K
(Null-Breite positiver Blick hinter) unter:
perl -pi.bak -e 's/\s{6}seqfile\s=\s\Kinfile/infil2/' testdata
I Tie finden :: einfacher Datei. – Svante