我正在尝试在.sql文件中搜索sql语句,该语句以 CREATE TABLE 开头,后跟字段值,然后是关键字[ TB_DATA和TB_INDX ],以<结尾强>
喜欢
CREATE TABLE HDTB_CODE (IDPK VARCHAR(256) NOT NULL) IN TB_DATA INDEX IN TB_INDX;
.sql文件语句有多行
CREATE TABLE HDTB_CODE
(
IDPK VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;
--CREATE TABLE HDTB_BYTE
(
RTID VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;
DROP TABLE HDTB_BYTE;
CREATE TABLE HDTB_RES
(
ARTID VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;
CREATE TABLE HDTB_DE
(
IDPK VARCHAR(256) NOT NULL
);
-------------output----------------------
CREATE TABLE HDTB_CODE
(
IDPK VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;
CREATE TABLE HDTB_RES
(
ARTID VARCHAR(256) NOT NULL
)
IN TB_DATA
INDEX IN TB_INDX;
答案 0 :(得分:1)
试试这个:
use strict;
use warnings;
my $filename = 'somefile.sql';
open(my $fh, '<', $filename) || die "unable to open '$filename' for read; $!";
local $/ = ""; # Paragraph mode
while (<$fh>) {
if (/^CREATE TABLE.+TB_DATA.+TB_INDX/s) {
print # or do something else
}
}
close $fh;
在$/
中使用空字符串标记“段落模式”,这意味着记录分隔符是两行(或更多)新行,因此它在空行上打破(如果不是这样的话) ,那么你可以使用“; \ n”)。
s
需要正则表达式后的.
修饰符才能匹配新行。
答案 1 :(得分:0)
use strict;
use warnings;
$/ = '';
print grep { $_ =~ /CREATE TABLE/ && $_ =~ /INDEX/} <>;
或者:
$/ = '';
print grep { /^CREATE TABLE.+TB_DATA.+TB_INDX/s} <>;
用法:
script_name.pl sql_file