2014-05-13 2 views
0

파일에있는 모든 create table ddls에서 세미콜론 (;) 앞에 삽입해야하는 문자열이 있습니다.perl에서 정규식 대체

CREATE TABLE Persons 
(
PersonID int, 
LastName varchar(255), 
FirstName varchar(255), 
Address varchar(255), 
City varchar(255) 
); 

출력은 다음과 같습니다

CREATE TABLE Persons 
(
PersonID int, 
LastName varchar(255), 
FirstName varchar(255), 
Address varchar(255), 
City varchar(255) 
) 
BLKSIZE 2048; 

지금 파일의 테이블 ddls을 만들 다수가 있고 난 단지 문자열 것을 원하는 등 카탈로그, 스키마, 뷰를 만드는 등 다른 ddls가 삽입 될 테이블 stmt에 대해서만 삽입됩니다.

나는 다음과 같은 시도 :
sub read_file { 
     my ($filename) = @_; 
     print "$filename \n"; 
     open my $in, '<', $filename or carp "Could not open '$filename' for reading $!"; 
     local $/ = undef; 
     my $all = <$in>; 
     close $in; 
     return $all; 
} 

sub write_file { 
     my ($filename, $content) = @_; 
     open my $out,'>', $filename or carp "Could not open '$filename' for writing $!"; 
     print $out $content; 
     close $out; 
     return; 
} 

sub changeddl{ 
     my $data = read_file($_); 
     print "$data \n"; 
     if($data=~m/\s*Create\s*Table.*/im){ 
       $data=~s/(\s*Create\s*Table).*(;$)/$1 blsize 2048 $2/gmi; 
       write_file(($_, $data)) 
     } 
}  

그런 다음 내가 파일과 전화 changeddl 전화 (DDL이 포함되어 있지만 실 거예요 작동합니다.) PLS 도움이됩니다.

답변

2

, Create\s*Table 모든 것을 일치 당신이 한 번에 테스트/대체 할 수있는, 일치 대체 할 필요,

가 없다 그 후 그것을 시도 \K

if ($data =~ s/Create\s*Table[^;]+\K/blsize 2048/gi) { 
    write_file(($_, $data)) 
} 
+0

감사합니다. 효과적으로 일했습니다. 고맙습니다. – May

0

gm 대신 s (한 줄) 플래그를 사용해야합니다.
또한 첫 번째 캡처 그룹 안에 dotall 토큰을 넣어야합니다.

과 같이 : 나는 조금 접근 변경했습니다

s/(\s*Create\s*Table.*?);/$1BLKSIZE 2048;/si 
+0

뒤에 긍정적 인 모습을 사용하여, ; 문자 아니지만 ...하지만 작동하지 않았다. 시간 내 주셔서 감사합니다 ... – May