2013-05-17 32 views
0

我想在一個.sql文件中搜索以CREATE TABLE開頭的sql語句,然後是字段值,然後是關鍵字[TB_DATA和TB_INDX],並以;它在多行perl腳本從一個帶有開始和結束關鍵字的文件中搜索多行

.sql文件語句是多行

-- CREATE TABLE HDTB_COD; 
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; 
-- DROP TABLE HDTB_COD; 
CREATE TABLE HDTB_DE (IDPK VARCHAR(256) 
NOT NULL); 

------------- -------------輸出---------

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; 

回答

1
perl -n -e 'chomp; next if (/^--/);@p=() if /CREATE TABLE/; push @p,$_; if (/IN TB_DATA INDEX IN TB_INDX;/) { print "@p\n"; }' t.sql 

它是如何工作

chomp; # remove newlines 
next if (/^--/); #skip lines that are SQL comments 
@p =() if /CREATE TABLE/; #start of a table definition, clear array @p 
push @p, $_; # put current line into array @p 
#condition found, print @p  
if (/IN TB_DATA INDEX IN TB_INDX;/) { print "@p\n"; } 
+0

如何在perl腳本 檢查我希望它只是從CREATE TABLE直到存儲;分號 like if(/ CREATE TABLE /)until(/; /)into一個單獨的文件 – Vivek

+0

對不起,我不明白你在問什麼Vivek? – Vorsprung

+0

.sql文件將有多行數據 打開我的$ fh,「 Vivek

0

這裏是浩的例子w創建快速和骯髒的解析管道。一旦你理解了基本模式,可以很容易地添加更多的過濾步驟(與grep)或轉化步驟(與map

# Slurp entire file. 
my $sql = do { local $/ = undef; <> }; 

# 1. Grab the CREATE TABLE statements. 
# 2. Retain only the statements of interest. 
# 3. Modify the statements as needed before printing. 
print 
    map { "$_\n" }       # 3b. Add trailing newlines. 
    map { s/\s+/ /g; $_ }     # 3a. Normalize whitespace. 
    grep { /IN TB_INDX/ }     # 2b. Filter. 
    grep { /IN TB_DATA INDEX/ }    # 2a. Filter. 
    $sql =~ /^(CREATE TABLE .+?;)\s*$/gsm; # 1. Grab. 
相關問題