Busque un patrón en un file y muévalo a los nuevos files uno por uno

Intento search un patrón particular en un file y moverlo a uno nuevo de uno en uno. Soy un novato y probé sed -n 's/CREATE PROCEDURE/,/END ;/p' File Está imprimiendo nuevamente el mismo file. El siguiente es el contenido del 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 ; 

Estoy intentando encontrar un script que me ayude a dividir el file anterior en files separados. Cada file debe comenzar con

SET PATH ……

y termina con

FIN ;

Entonces la salida debería ser como

Contenido en el file 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 ; 

Contenido en el file 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 ; 

¿Qué se puede hacer para lograr esto? Estoy sorprendido aquí.

La solución que ofrezco inicia cada file con 'SET PATH'. No verifica 'END' al final de la sección (pero no explicó qué sucedería si ocurriera un 'SET PATH' posterior sin un 'END' anterior, entonces asumo que esto no es difícil requisito).

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

El command csplit divide el file source.sql con la expresión regular que corresponde a la cadena 'SET PATH' anclado al comienzo de la línea. Existen varios indicadores que controlan los nombres de los files de salida, pero de forma pnetworkingeterminada, el resultado de su muestra se almacena en los files xx00 y xx01 .