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::Compareます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 にファイルを丸呑みするように指示するため、正規表現は 1 回だけ実行されます。そのため、/gファイルごとに複数の置換が必要な場合に備えて、グローバル修飾子を追加しました。

ご覧のとおり\s+、スペースの代わりに使用して、ランダムに挿入された可能性のある改行に一致させます。-pi要するに、ターゲットファイルでインプレース編集を実行することを意味し、.bakその後-i、その拡張子でバックアップを保存することを意味します。バックアップを保存することをお勧めしますが、必須ではありません (Windows を除く)。

于 2012-05-02T15:37:12.603 に答える