我有需要与CVS文件进行比较的Oracle文件,但问题是有很多文件我想忽略第一行作为diff的一部分。我想运行一个打开每个文件的脚本,并以最终输出用'CREATE OR REPLACE PACKAGE "TRON"."SOME_PACKAGE" IS'
替换'CREATE OR REPLACE PACKAGE SOME_PACKAGE IS'
的方式替换文件内容。我遇到的问题是该声明可以跨越几行,所以我必须考虑像'CREATE OR REPLACE "TRON"."SOME_PACKAGE"
这样的情况。
IS'
我的方法(因为这是Jenkins工作的一部分)是循环遍历工作区中的所有文件,修改符合此条件的任何文件。然后,我可以使用现有的使用File::Compare
和Text::Diff::Table
的Perl脚本。
我一直在使用Zaid's solution进行测试但收效甚微,因为它仍然没有处理命令字符串跨越多行的情况。 (我的更改):
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;
答案 0 :(得分: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除外)。