我正在尝试编写一个将执行以下操作的Perl脚本: 比较来自不同源目录的两个具有相同名称的文件,意思是:
diff source_dir_1/file_1 source_dir_2/files_2
并且对于file_2中的每个更改行(与file_1相比),它将在第三个文件中找到file_1(已在file_2中更改)的行:source_dir_3 / file_3,并将此行替换为file_2中的行。< / p>
例如,对于:
file_1:
我的名字是沙哈尔 你好世界
很高兴见到
file_2
我的名字是沙哈尔 再见世界
很高兴见到
file_3:
这条线可以不同 你好世界
很高兴见到
生成的file_3将是:
file_3_after_script:
这条线可以不同 再见世界
很高兴见到
我在编写时遇到问题,因为有时file_1中的一行会被file_2中的几行替换,
您对如何处理此问题有任何建议吗?
答案 0 :(得分:0)
你的目标不明确。请始终在SO中包含您在任何问题中尝试过的代码。
然而,当然可以同时打开3个文件并对它们执行逻辑。
以下显示了我对目标的最佳解释。它循环遍历每个文件的行,如果file1和2不同,则从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)
输出:
file3: This line can be different
file2: Goodbye World
file3: Nice to meet
答案 1 :(得分:0)
试试这个
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";
这也会提供您尝试的输出。