1

我有需要与 CVS 文件进行比较的 Oracle 文件,但问题是有很多文件我想忽略第一行作为差异的一部分。我想运行一个脚本来打开每个文件,并以最终输出替换'CREATE OR REPLACE PACKAGE "TRON"."SOME_PACKAGE" IS''CREATE OR REPLACE PACKAGE SOME_PACKAGE IS'. 我遇到的问题是该语句可以跨越多行,所以我必须考虑这样的情况。'CREATE OR REPLACE "TRON"."SOME_PACKAGE"
IS'

我的方法(因为这是 Jenkins 工作的一部分)是遍历工作区中的所有文件,修改任何符合此条件的文件。然后我可以使用我现有的 Perl 脚本,它正在使用File::Compareand Text::Diff::Table

我一直在测试Zaid 的解决方案,但收效甚微,因为它仍然无法处理命令字符串跨越多行的情况。(我的改变):

use strict;
use warnings;
use Tie::File;
use Data::Dumper;

my @array;

tie @array, 'Tie::File', 'c:\cb_k_check_recon_mma.sps' or die "Unable to tie file";

my %unwanted = map  { $_ => 1 }
               map  { $_-1..$_-4, $_, $_+2 .. $_+4 }
               grep { $array[$_] =~ /^CREATE.*[IS|AS]$/ }
               0 .. $#array ;

print Dumper \%unwanted;

@array = map { $array[$_] } grep { ! $unwanted{$_} } 0 .. $#array;
print Dumper \@array;

untie @array;
4

1 回答 1

1

如果文本可以跨越多行,则要使单个正则表达式起作用,您需要将文件读入字符串,而不是逐行读取。

perl -0777 -pi.bak -e 's/CREATE\s+OR\s+REPLACE\s+PACKAGE\s+"TRON"\."SOME_PACKAGE"\s+IS/CREATE OR REPLACE PACKAGE SOME_PACKAGE IS/g' /path/*.pl

这个-0777开关告诉 perl 去 slurp 文件,所以正则表达式只会运行一次。出于这个原因,我添加了全局/g修饰符,以防每个文件需要多个替换。

如您所见,我使用\s+而不是空格来匹配可能随机插入的换行符。-pi简而言之,意味着对目标文件执行就地编辑,.bak之后-i意味着使用该扩展名保存备份。建议保存备份,但不是必需的(Windows 除外)。

于 2012-05-02T15:37:12.603 回答