Shell-Script
在文件中搜尋一個模式,並將其逐個移動到新文件中
我正在嘗試在文件中搜尋特定模式並將其一一移動到新文件中。我試過
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
有各種標誌控制輸出文件的名稱,但預設情況下,您的範例輸出被放入文件xx00
和xx01
.