我正在尝试搜索模式,将其替换为另一个文件的内容,并将整个文件写入新文件。但我不想改变原始文件的内容。我试图在部分中执行此操作,意味着,在第一次运行中替换模式,将整个事物写入不同的文件并将此模式替换回原始模式。但出于某种原因,即使我的替代品和替代品也无效。以下是我的perl代码。如果有更好的方法来做这个bash,请多加一些亮点。
我想读的文件是test.txt,它有很多东西。我想要修改并写入不同文件的那个将是这样的:
blah blah blah
blah blah PATTERN blah blah
blah blah blah
现在我希望这与我完成时完全相同,但应该有另一个文件test2.txt,如下所示:
blah blah blah
blah blah STUFF FROM TEST.TXT blah blah
blah blah blah
#!/usr/local/bin/perl
use strict;
use warnings;
my @m;
my $filename = "test1.txt";
my $filename1 = "test2.txt";
open(WPR,"<",$filename);
@m=<WPR>;
close(WPR);
open(FPR,">>",$filename1);
while(<FPR>)
{
s/PATTERN/@m/;
}
close(FPR);
答案 0 :(得分:2)
您可以尝试这样的事情:
$ cat mainfile
blah blah blah
blah blah PATTERN blah blah
blah blah blah
$ cat lookupfile
this is my lookup file
$ text=$(<lookupfile)
$ sed "s/PATTERN/$text/" mainfile
blah blah blah
blah blah this is my lookup file blah blah
blah blah blah
答案 1 :(得分:0)
尝试将您正在阅读的文件的内容标记为标量:
my $content = join('', <WPR>);
然后使用该标量进行替换:
s/PATTERN/$content/;
答案 2 :(得分:0)
您可以尝试使用one-liner
:
perl -pe '
BEGIN { @d = do { local $/ = undef; open $fh, q|<|, shift; <$fh> }; chomp @d }
s/four/@d/
' test1.txt text2.txt
我以slurp模式处理第一个文件并将其所有内容保存在一个数组中。 -p
开关逐行处理另一个作为参数提供的参数,因此您可以将正则表达式应用于每一行。
假设text1.txt
包含数据:
new
data
text2.txt
与:
one
two
three
four
five
six
seven
four
nine
ten
它产生:
one
two
three
new
data
five
six
seven
new
data
nine
ten
答案 3 :(得分:0)
您正在 write 模式下打开输出文件,然后尝试从中读取。这不会做太多。
试试这个:
#!/usr/local/bin/perl
use strict;
use warnings;
my $m;
my $filename = "test1.txt";
my $filename1 = "test2.txt";
undef $/;
open(WPR,"<",$filename);
$m=<WPR>;
close(WPR);
open(FPR,"<",$filename1);
my $input = <FPR>;
close(FPR);
$input =~ s/PATTERN/$m;
open(OUT,">",$filename1);
print OUT $input;
close OUT;