Shell-Script

在文件中搜尋一個模式,並將其逐個移動到新文件中

  • August 25, 2018

我正在嘗試在文件中搜尋特定模式並將其一一移動到新文件中。我試過sed -n 's/CREATE PROCEDURE/,/END ;/p' File它再次列印相同的文件。下面給出的是文件內容。

SET PATH "QSYS","QSYS2","JOES" ; 

CREATE PROCEDURE JOES.CANCELORDERLINE ( 
   IN ORDERID INTEGER , 
   IN ORDERLINEID INTEGER , 
   IN NEWORDLINESTATUSCODE VARCHAR(10) , 
   IN NAME VARCHAR(50) , 
   OUT O_RESULT CHAR(5) ) 
   LANGUAGE SQL 
   SPECIFIC JOES.CANCELORDERLINE 
   NOT DETERMINISTIC 
   MODIFIES SQL DATA 
   CALLED ON NULL INPUT 
   SET OPTION  ALWBLK = *ALLREAD , 
   ALWCPYDTA = *OPTIMIZE , 
   COMMIT = *NONE , 
   DECRESULT = (31, 31, 00) , 
   DFTRDBCOL = *NONE , 
   DYNDFTCOL = *NO , 
   DYNUSRPRF = *USER , 
   SRTSEQ = *HEX   
   BEGIN ATOMIC 

   DECLARE V_ORDLINENUMFORDSP VARCHAR ( 16 ) ; 

   DECLARE V_ORDLINENUMSTR VARCHAR ( 3 ) ; 

   DECLARE V_ORDLINENUM INT ; 

   DECLARE V_RESULT CHAR ( 5 ) DEFAULT '00000' ; 

   DECLARE SQLSTATE CHAR ( 5 ) DEFAULT '00000' ; 



DECLARE V_ORDLNSTATUSHISTID INT ; 

   DECLARE V_ORDERID INT DEFAULT 0 ; 

   DECLARE V_ORDERLINEID INT DEFAULT 0 ; 

   DECLARE V_NEWORDLINESTATUSCODE VARCHAR ( 10 ) DEFAULT '' ; 

DECLARE V_OLDSTATUS VARCHAR ( 100 ) DEFAULT '' ; 

   DECLARE EXIT HANDLER FOR SQLEXCEPTION 

       SET O_RESULT = SQLSTATE ; 

       SET O_RESULT = V_RESULT ; 


SET V_ORDERID = ORDERID ; 
SET V_ORDERLINEID = ORDERLINEID ; 
SET V_NEWORDLINESTATUSCODE = NEWORDLINESTATUSCODE ; 


/* Insert a new record for the new line OrdLineStatusHist*/ 
   SET V_OLDSTATUS = ( SELECT OLSH . ORDLNSTATUSTYPECD FROM JOES . ORDERLINESTATUSHIST OLSH WHERE OLSH . CLIENTORDERID = V_ORDERID AND OLSH . CLIENTORDERLINEID = V_ORDERLINEID AND OLSH . STATUSENDDATETIME IS NULL ) ; 

   IF ( ( V_OLDSTATUS IS NULL ) OR ( V_OLDSTATUS <> V_NEWORDLINESTATUSCODE ) ) THEN 


       IF ( EXISTS ( SELECT ORDLNSTATUSHISTID FROM JOES . ORDERLINESTATUSHIST WHERE CLIENTORDERID = V_ORDERID AND CLIENTORDERLINEID = V_ORDERLINEID ) ) 
       THEN 
           SET V_ORDLNSTATUSHISTID = ( SELECT MAX ( ORDLNSTATUSHISTID ) FROM JOES . ORDERLINESTATUSHIST WHERE CLIENTORDERID = V_ORDERID AND CLIENTORDERLINEID = V_ORDERLINEID ) ; 
       ELSE 
           SET V_ORDLNSTATUSHISTID = 0 ; 
       END IF ; 


       IF ( V_ORDLNSTATUSHISTID > 0 ) THEN 

       UPDATE  JOES . ORDERLINESTATUSHIST SET STATUSENDDATETIME = CURRENT TIMESTAMP , LASTUPDATENAME = NAME , UPDTIMESTAMP = CURRENT TIMESTAMP WHERE 
       CLIENTORDERID = V_ORDERID AND CLIENTORDERLINEID = V_ORDERLINEID AND ORDLNSTATUSHISTID = V_ORDLNSTATUSHISTID ; 

       END IF ; 

       SET V_ORDLNSTATUSHISTID = V_ORDLNSTATUSHISTID + 1 ; 

       INSERT INTO JOES . ORDERLINESTATUSHIST ( CLIENTORDERID , CLIENTORDERLINEID , ORDLNSTATUSHISTID , ORDLNSTATUSTYPECD , STATUSSTARTDATETIME , STATUSENDDATETIME , 
       CREATENAME , CREATETIMESTAMP ) VALUES ( V_ORDERID , V_ORDERLINEID , V_ORDLNSTATUSHISTID , V_NEWORDLINESTATUSCODE , CURRENT TIMESTAMP , CURRENT TIMESTAMP , NAME , CURRENT TIMESTAMP ) ; 

       UPDATE JOES . CLIENTORDERLINE SET 
           ORDLNSTATUSTYPECD = V_NEWORDLINESTATUSCODE , UPDTIMESTAMP = CURRENT TIMESTAMP WHERE CLIENTORDERID = V_ORDERID AND CLIENTORDERLINEID = V_ORDERLINEID ; 

   END IF ; 

END  ; 

SET PATH "QSYS","QSYS2","JOES" ; 

CREATE PROCEDURE JOES.CANCELTRANSFERNUMBER ( 
   IN TRANSFERNUMBER INTEGER , 
   OUT O_RETURNCODE CHAR(10) , 
   OUT O_RETURNMESSAGE CHAR(50) , 
   OUT O_RESULT CHAR(5) ) 
   LANGUAGE SQL 
   SPECIFIC JOES.CANCELTRANSFERNUMBER 
   NOT DETERMINISTIC 
   MODIFIES SQL DATA 
   CALLED ON NULL INPUT 
   SET OPTION  ALWBLK = *ALLREAD , 
   ALWCPYDTA = *OPTIMIZE , 
   COMMIT = *NONE , 
   DECRESULT = (31, 31, 00) , 
   DFTRDBCOL = *NONE , 
   DYNDFTCOL = *NO , 
   DYNUSRPRF = *USER , 
   SRTSEQ = *HEX   
   BEGIN 

DECLARE V_SYNONRTNCD CHAR ( 7 ) DEFAULT '' ; 
DECLARE V_RETURMESSAGE CHAR ( 50 ) DEFAULT 'SUCCESS' ; 
DECLARE V_RETURNCODE CHAR ( 10 ) DEFAULT '' ; 
DECLARE V_TRANSFERNUMBER INTEGER ; 
DECLARE V_CHARTRANSFERBATCHNUMBER CHAR ( 15 ) ; 
DECLARE V_TRANSFERBATCHNUMBER INTEGER ; 
DECLARE V_RESULT CHAR ( 5 ) DEFAULT '00000' ; 
DECLARE SQLSTATE CHAR ( 5 ) DEFAULT '00000' ; 

SET O_RESULT = SQLSTATE ; 
SET O_RESULT = V_RESULT ; 


SET V_TRANSFERNUMBER = TRANSFERNUMBER ; 

SET V_TRANSFERBATCHNUMBER = ( SELECT MAX ( TRANSFERBATCH ) FROM JOES . TRANSFERREQHEADER WHERE TRANSFERNUMBER = V_TRANSFERNUMBER ) ; 
SET V_CHARTRANSFERBATCHNUMBER = CHAR ( V_TRANSFERBATCHNUMBER ) ; 

CALL MWWPROD . BAERXFR ( V_SYNONRTNCD , V_CHARTRANSFERBATCHNUMBER , V_RETURNCODE , V_RETURMESSAGE ) ; 

DELETE FROM JOES . TRANSFERREQHEADER WHERE TRANSFERBATCH = V_TRANSFERBATCHNUMBER ; 
DELETE FROM JOES . TRANSFERREQLINE WHERE TRANSFERBATCH = V_TRANSFERBATCHNUMBER ; 

SET O_RETURNCODE = V_RETURNCODE ; 
SET O_RETURNMESSAGE = V_RETURMESSAGE ; 

END  ;

我正在嘗試一個腳本來幫助我將上述文件拆分為單獨的文件。每個文件應以

設置路徑……

並以

結尾 ;

所以輸出應該像

文件 1 中的內容:

SET PATH "QSYS","QSYS2","JOES" ; 

CREATE PROCEDURE JOES.CANCELORDERLINE ( 
   IN ORDERID INTEGER , 
   IN ORDERLINEID INTEGER , 
   IN NEWORDLINESTATUSCODE VARCHAR(10) , 
   IN NAME VARCHAR(50) , 
   OUT O_RESULT CHAR(5) ) 
   LANGUAGE SQL 
   SPECIFIC JOES.CANCELORDERLINE 
   NOT DETERMINISTIC 
   MODIFIES SQL DATA 
   CALLED ON NULL INPUT 
   SET OPTION  ALWBLK = *ALLREAD , 
   ALWCPYDTA = *OPTIMIZE , 
   COMMIT = *NONE , 
   DECRESULT = (31, 31, 00) , 
   DFTRDBCOL = *NONE , 
   DYNDFTCOL = *NO , 
   DYNUSRPRF = *USER , 
   SRTSEQ = *HEX   
   BEGIN ATOMIC 

   DECLARE V_ORDLINENUMFORDSP VARCHAR ( 16 ) ; 

   DECLARE V_ORDLINENUMSTR VARCHAR ( 3 ) ; 

   DECLARE V_ORDLINENUM INT ; 

   DECLARE V_RESULT CHAR ( 5 ) DEFAULT '00000' ; 

   DECLARE SQLSTATE CHAR ( 5 ) DEFAULT '00000' ; 



DECLARE V_ORDLNSTATUSHISTID INT ; 

   DECLARE V_ORDERID INT DEFAULT 0 ; 

   DECLARE V_ORDERLINEID INT DEFAULT 0 ; 

   DECLARE V_NEWORDLINESTATUSCODE VARCHAR ( 10 ) DEFAULT '' ; 

DECLARE V_OLDSTATUS VARCHAR ( 100 ) DEFAULT '' ; 

   DECLARE EXIT HANDLER FOR SQLEXCEPTION 

       SET O_RESULT = SQLSTATE ; 

       SET O_RESULT = V_RESULT ; 


SET V_ORDERID = ORDERID ; 
SET V_ORDERLINEID = ORDERLINEID ; 
SET V_NEWORDLINESTATUSCODE = NEWORDLINESTATUSCODE ; 


/* Insert a new record for the new line OrdLineStatusHist*/ 
   SET V_OLDSTATUS = ( SELECT OLSH . ORDLNSTATUSTYPECD FROM JOES . ORDERLINESTATUSHIST OLSH WHERE OLSH . CLIENTORDERID = V_ORDERID AND OLSH . CLIENTORDERLINEID = V_ORDERLINEID AND OLSH . STATUSENDDATETIME IS NULL ) ; 

   IF ( ( V_OLDSTATUS IS NULL ) OR ( V_OLDSTATUS <> V_NEWORDLINESTATUSCODE ) ) THEN 


       IF ( EXISTS ( SELECT ORDLNSTATUSHISTID FROM JOES . ORDERLINESTATUSHIST WHERE CLIENTORDERID = V_ORDERID AND CLIENTORDERLINEID = V_ORDERLINEID ) ) 
       THEN 
           SET V_ORDLNSTATUSHISTID = ( SELECT MAX ( ORDLNSTATUSHISTID ) FROM JOES . ORDERLINESTATUSHIST WHERE CLIENTORDERID = V_ORDERID AND CLIENTORDERLINEID = V_ORDERLINEID ) ; 
       ELSE 
           SET V_ORDLNSTATUSHISTID = 0 ; 
       END IF ; 


       IF ( V_ORDLNSTATUSHISTID > 0 ) THEN 

       UPDATE  JOES . ORDERLINESTATUSHIST SET STATUSENDDATETIME = CURRENT TIMESTAMP , LASTUPDATENAME = NAME , UPDTIMESTAMP = CURRENT TIMESTAMP WHERE 
       CLIENTORDERID = V_ORDERID AND CLIENTORDERLINEID = V_ORDERLINEID AND ORDLNSTATUSHISTID = V_ORDLNSTATUSHISTID ; 

       END IF ; 

       SET V_ORDLNSTATUSHISTID = V_ORDLNSTATUSHISTID + 1 ; 

       INSERT INTO JOES . ORDERLINESTATUSHIST ( CLIENTORDERID , CLIENTORDERLINEID , ORDLNSTATUSHISTID , ORDLNSTATUSTYPECD , STATUSSTARTDATETIME , STATUSENDDATETIME , 
       CREATENAME , CREATETIMESTAMP ) VALUES ( V_ORDERID , V_ORDERLINEID , V_ORDLNSTATUSHISTID , V_NEWORDLINESTATUSCODE , CURRENT TIMESTAMP , CURRENT TIMESTAMP , NAME , CURRENT TIMESTAMP ) ; 

       UPDATE JOES . CLIENTORDERLINE SET 
           ORDLNSTATUSTYPECD = V_NEWORDLINESTATUSCODE , UPDTIMESTAMP = CURRENT TIMESTAMP WHERE CLIENTORDERID = V_ORDERID AND CLIENTORDERLINEID = V_ORDERLINEID ; 

   END IF ; 

END  ;

文件 2 中的內容:

SET PATH "QSYS","QSYS2","JOES" ; 

CREATE PROCEDURE JOES.CANCELTRANSFERNUMBER ( 
   IN TRANSFERNUMBER INTEGER , 
   OUT O_RETURNCODE CHAR(10) , 
   OUT O_RETURNMESSAGE CHAR(50) , 
   OUT O_RESULT CHAR(5) ) 
   LANGUAGE SQL 
   SPECIFIC JOES.CANCELTRANSFERNUMBER 
   NOT DETERMINISTIC 
   MODIFIES SQL DATA 
   CALLED ON NULL INPUT 
   SET OPTION  ALWBLK = *ALLREAD , 
   ALWCPYDTA = *OPTIMIZE , 
   COMMIT = *NONE , 
   DECRESULT = (31, 31, 00) , 
   DFTRDBCOL = *NONE , 
   DYNDFTCOL = *NO , 
   DYNUSRPRF = *USER , 
   SRTSEQ = *HEX   
   BEGIN 

DECLARE V_SYNONRTNCD CHAR ( 7 ) DEFAULT '' ; 
DECLARE V_RETURMESSAGE CHAR ( 50 ) DEFAULT 'SUCCESS' ; 
DECLARE V_RETURNCODE CHAR ( 10 ) DEFAULT '' ; 
DECLARE V_TRANSFERNUMBER INTEGER ; 
DECLARE V_CHARTRANSFERBATCHNUMBER CHAR ( 15 ) ; 
DECLARE V_TRANSFERBATCHNUMBER INTEGER ; 
DECLARE V_RESULT CHAR ( 5 ) DEFAULT '00000' ; 
DECLARE SQLSTATE CHAR ( 5 ) DEFAULT '00000' ; 

SET O_RESULT = SQLSTATE ; 
SET O_RESULT = V_RESULT ; 


SET V_TRANSFERNUMBER = TRANSFERNUMBER ; 

SET V_TRANSFERBATCHNUMBER = ( SELECT MAX ( TRANSFERBATCH ) FROM JOES . TRANSFERREQHEADER WHERE TRANSFERNUMBER = V_TRANSFERNUMBER ) ; 
SET V_CHARTRANSFERBATCHNUMBER = CHAR ( V_TRANSFERBATCHNUMBER ) ; 

CALL MWWPROD . BAERXFR ( V_SYNONRTNCD , V_CHARTRANSFERBATCHNUMBER , V_RETURNCODE , V_RETURMESSAGE ) ; 

DELETE FROM JOES . TRANSFERREQHEADER WHERE TRANSFERBATCH = V_TRANSFERBATCHNUMBER ; 
DELETE FROM JOES . TRANSFERREQLINE WHERE TRANSFERBATCH = V_TRANSFERBATCHNUMBER ; 

SET O_RETURNCODE = V_RETURNCODE ; 
SET O_RETURNMESSAGE = V_RETURMESSAGE ; 

END  ;

可以做些什麼來實現這一目標?我在這裡感到震驚。

我提供的解決方案以“SET PATH”開始每個文件。它不會在該部分的末尾檢查“END”(但您沒有解釋如果隨後的“SET PATH”發生而沒有前面的“END”會發生什麼,所以我假設這並不難要求)。

csplit -kz source.sql '/^SET PATH /' '{*}'

該命令使用與錨定到行首的字元串“SET PATH”相對應的正則表達式csplit拆分文件。source.sql有各種標誌控制輸出文件的名稱,但預設情況下,您的範例輸出被放入文件xx00xx01.

引用自:https://unix.stackexchange.com/questions/234996