Regex 如何将两个文件之间的差异结果合并到第三个文件中?

Regex 如何将两个文件之间的差异结果合并到第三个文件中?,regex,perl,Regex,Perl,我正在尝试编写一个Perl脚本,它将执行以下操作: 比较来自不同源目录的两个同名文件,这意味着: diff source_dir_1/file_1 source_dir_2/files_2 对于文件_2中的每个更改行(与文件_1相比),它将在第三个文件中找到文件_1中的行(在文件_2中已更改):source_dir_3/file_3,并用文件_2中的行替换该行 例如: 文件\u 1: 我叫沙哈尔 你好,世界 很高兴见到你 文件2 我叫沙哈尔 再见世界 很高兴见到你 文件\u 3: 这一行可以不

我正在尝试编写一个Perl脚本,它将执行以下操作: 比较来自不同源目录的两个同名文件,这意味着:

diff source_dir_1/file_1 source_dir_2/files_2
对于文件_2中的每个更改行(与文件_1相比),它将在第三个文件中找到文件_1中的行(在文件_2中已更改):source_dir_3/file_3,并用文件_2中的行替换该行

例如:

文件\u 1:

我叫沙哈尔
你好,世界
很高兴见到你

文件2

我叫沙哈尔
再见世界
很高兴见到你

文件\u 3:

这一行可以不同
你好,世界
很高兴见到你

生成的文件_3将是:

脚本之后的文件\u 3\u:

这一行可以不同
再见世界
很高兴见到你

我在写它时遇到了一个问题,因为有时候文件_1中的一行会被文件_2中的几行替换


你对我应该如何处理这个问题有什么建议吗?

你的目标不清楚。始终在任何问题中包含您尝试过的代码

然而,当然可以同时打开3个文件并对其执行逻辑

以下是我对你的目标的最佳诠释。它循环遍历每个文件的行,如果file1和file2不同,则打印file2中的行,否则打印file3

use strict;
use warnings;
use autodie;

my $file1 = '...';
my $file2 = '...';
my $file3 = '...';

#open my $fh1, '<', $file1;
#open my $fh2, '<', $file2;
#open my $fh3, '<', $file3;
# Open to strings temporarily to make script self-contained:
open my $fh1, '<', \ "My name is Shahar\nHello World\nNice to meet\n";
open my $fh2, '<', \ "My name is Shahar\nGoodbye World\nNice to meet\n";
open my $fh3, '<', \ "This line can be different\nHello World\nNice to meet\n";

while (! grep eof $_, $fh1, $fh2, $fh3) {
    my $line1 = <$fh1>;
    my $line2 = <$fh2>;
    my $line3 = <$fh3>;

    print $line1 ne $line2 ? "file2: $line2" : "file3: $line3";
}

print "file3: $_" while (<$fh3>); # Print rest of file (if any)
试试这个

open (file1,'file_1');
open (file2,'file_2');
open (file3,'file_3');
@f1= <file1>;
@f2 = <file2>;
@f3 = <file3>;
print "$f3[0]\n$f2[1]\n$f1[2]\n";
open(file1,'file_1');
打开(文件2,'file_2');
打开(文件3,“文件3”);
@f1=;
@f2=;
@f3=;
打印“$f3[0]\n$f2[1]\n$f1[2]\n”;

这也会提供您尝试的输出。

您的描述不清楚。第一行在文件_1和文件_2中是相同的,但是您仍然用第_3行中的行替换它。您可能会发现它很有用。听起来像是个问题。试试谷歌,看看这个问题是否已经用其他工具解决了。谢谢你,我用了前面的建议,非常有用
open (file1,'file_1');
open (file2,'file_2');
open (file3,'file_3');
@f1= <file1>;
@f2 = <file2>;
@f3 = <file3>;
print "$f3[0]\n$f2[1]\n$f1[2]\n";