与 Perl 打交道并已被阻止的第一天 :)
情况是这样的:一个文件在文件夹 A 中更新,但也存在于文件夹 B、C 和 D 中,为了更容易,所有文件都可以不同,所以我不能只做一个差异。打算复制到其他文件的新行由行尾的标志标识,例如#I。
更新前的文件如下所示:
First line
Second line
Fifth line
更新后是这样的:
First line
Second line
Third line #I
Fourth line #I
Fifth line
Sixth line #I
我需要做的是在其他文件上搜索“第二行”,插入标有#I的行 - 按照它们插入的顺序 - 然后搜索“第五行”并插入“第六行#I” .
在这个例子中,它们都是连续的,但是在我需要更新的文件中,第一个更新块和第二个(以及第三个等等)之间可以有几行。
将要更新的文件可以是sh脚本、awk脚本、纯文本文件等,脚本应该是通用的。该脚本将有两个入口参数,更新的文件和要更新的文件。
欢迎提供有关如何执行此操作的任何提示。如果需要,我可以提供到目前为止的代码 - 关闭但尚未工作。
谢谢,
若昂
PS:这是我到目前为止所拥有的
# Pass the content of the file $FileUpdate to the updateFile array
@updateFile = <UPD>;
# Pass the content of the file $FileOriginal to the originalFile array
@originalFile = <ORG>;
# Remove empty lines from the array contained on the updated file
@updateFile = grep(/\S/, @updateFile);
# Create an array that will contain the modifications and the line
# prior to the first modification.
@modifications = ();
# Counter initialization
$i = 0;
# Loop the array to find out which lines are flagged as new and
# which lines immediately precede those
foreach $linha (@updateFile) {
# Remove \n characters
chomp($linha);
# Find the new lines flagged with #I
if ($linha =~ m/#I$/) {
# Verify that the previous line is not flagged as updated.
# If it is not, it means that the update starts here.
unless ($updateFile[$i-1] =~ m/#I$/) {
print "Line where the update starts $updateFile[$i-1]\n";
# Add that line to the array modifications
push(@modifications, $updateFile[$i-1]);
} # END OF unless
print "$updateFile[$i]\n";
# Add the lines tagged for insertion into the array
push(@modifications, $updateFile[$i]);
} # END OF if ($linha =~ m/#I$/)
# Increment the counter
$i = $i + 1;
} # END OF foreach $linha (@updateFile)
foreach $modif (@modifications) {
unless ($modif =~ m/#I$/) {
foreach $original (@originalFile) {
chomp($original);
if ($original ne $modif) {
push (@newOriginal, $originalFile[$n]);
}
elsif ($original eq $modif) { #&& $modif[$n+1] =~ m/#I$/) {
push (@newOriginal, $originalFile[$n]);
last;
}
$n = $n + 1;
}
}
if ($modif =~ m/#I$/) {
push (@newOriginal, $modifications[$m]);
}
$m = $m + 1;
}
获得的结果几乎是我想要但还没有的结果。