搜索模式并替换该行

时间:2014-03-02 00:05:18

标签: regex perl bash

我正在尝试搜索模式,将其替换为另一个文件的内容,并将整个文件写入新文件。但我不想改变原始文件的内容。我试图在部分中执行此操作,意味着,在第一次运行中替换模式,将整个事物写入不同的文件并将此模式替换回原始模式。但出于某种原因,即使我的替代品和替代品也无效。以下是我的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);

4 个答案:

答案 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;