行で特定のパターンが見つかった場合は、文字列の検索と置換

行で特定のパターンが見つかった場合は、文字列の検索と置換

CCSID私がしなければならないのは、このファイル内で検索して見つけたものです。CCSIDそのCHAR行のはに変わり、その行のNCHARVARCHARに変更する必要がありますNVARCHAR2

sedとawkを使ってみました。しかし、この問題に対する完璧な解決策が見つかりません。

 CREATE TABLE JCR.ICMSTSYSCONTROL (
            LIBRARYSERVERID  INTEGER NOT NULL ,
            LANGUAGECODE  CHAR(3) CCSID 37 NOT NULL ,
            SYSSEGMENTID  SMALLINT NOT NULL ,
            SYSSEGMENTTHRESHLD  INTEGER NOT NULL ,
            ACLBINDINGLEVEL  SMALLINT NOT NULL ,
            LIBRARYACLCODE  INTEGER NOT NULL ,
            PUBACCESSENABLED  SMALLINT NOT NULL ,
            DFLTACLCHOICE  SMALLINT NOT NULL ,
            SMSCHOICE SMALLINT NOT NULL ,
            TRACELEVEL SMALLINT NOT NULL ,
            MAXUSERS INTEGER NOT NULL ,
            MAXUSERACTION  SMALLINT NOT NULL ,
            CURRENTUSERS  INTEGER NOT NULL ,
            MAXLOGONRETRY  SMALLINT NOT NULL ,
            PASSWORDDURATION  SMALLINT NOT NULL ,
            SYSADMINEVENTFLAG  SMALLINT NOT NULL ,
            SYSTEMFLAG SMALLINT NOT NULL ,
            DATABASETYPE  SMALLINT NOT NULL ,
            MAXTXDURATION  INTEGER NOT NULL ,
            MAXRESULTSETSIZE  INTEGER NOT NULL ,
            ALLOWTRUSTEDLOGON  SMALLINT NOT NULL ,
            DOCROUTINGUPDATE  INTEGER NOT NULL ,
            DOCROUTINGFREQ  SMALLINT NOT NULL ,
            PLATFORM SMALLINT NOT NULL ,
            SYSTIMEOUT SMALLINT NOT NULL ,
            TIEUSERID CHAR(175) CCSID 37 DEFAULT NULL ,
            TIEPASSWORD  CHAR(72) FOR BIT DATA DEFAULT NULL ,
            DATABASENAME  VARCHAR(128) CCSID 37 NOT NULL ,
            DBSCHEMANAME  VARCHAR(128) CCSID 37 NOT NULL ,
            TRACEFILENAME  VARCHAR(128) CCSID 37 DEFAULT NULL ,
            ENCRYPTIONKEY  VARCHAR(128) FOR BIT DATA NOT NULL ,
            KEEPTRACEOPEN  SMALLINT NOT NULL ,
            MULTIPLETRACEFILES  SMALLINT NOT NULL ,
            MAXTRACEFILESIZE  INTEGER NOT NULL ,
            PATHICMROOT  VARCHAR(128) CCSID 37 NOT NULL ,
            PATHICMDLL VARCHAR(128) CCSID 37 NOT NULL ,
            SUSPENDSERVERTIME  TIMESTAMP DEFAULT NULL ,
            RMSTATUSINTERVAL  SMALLINT NOT NULL ,
            RMSTATUSTIMEOUT  SMALLINT NOT NULL ,
            TIEINTERVAL  SMALLINT NOT NULL ,
            LSCURRENTVERSION  VARCHAR(128) CCSID 37 NOT NULL ,
            TRACEUSER CHAR(175) CCSID 37 DEFAULT NULL ,
            DIMSGDIGESTALGO  SMALLINT NOT NULL DEFAULT 0 ,
            DIENCRYPTIONALGO  SMALLINT NOT NULL DEFAULT 0 ,
            CONSTRAINT JCR.ICMSTSYSCONTROLPK PRIMARY KEY( LIBRARYSERVERID ) )
            ;

出力は次のようになります。

CREATE TABLE JCR.ICMSTSYSCONTROL (
                LIBRARYSERVERID  INTEGER NOT NULL ,
                LANGUAGECODE  NCHAR(3) CCSID 37 NOT NULL ,
                SYSSEGMENTID  SMALLINT NOT NULL ,
                SYSSEGMENTTHRESHLD  INTEGER NOT NULL ,
                ACLBINDINGLEVEL  SMALLINT NOT NULL ,
                LIBRARYACLCODE  INTEGER NOT NULL ,
                PUBACCESSENABLED  SMALLINT NOT NULL ,
                DFLTACLCHOICE  SMALLINT NOT NULL ,
                SMSCHOICE SMALLINT NOT NULL ,
                TRACELEVEL SMALLINT NOT NULL ,
                MAXUSERS INTEGER NOT NULL ,
                MAXUSERACTION  SMALLINT NOT NULL ,
                CURRENTUSERS  INTEGER NOT NULL ,
                MAXLOGONRETRY  SMALLINT NOT NULL ,
                PASSWORDDURATION  SMALLINT NOT NULL ,
                SYSADMINEVENTFLAG  SMALLINT NOT NULL ,
                SYSTEMFLAG SMALLINT NOT NULL ,
                DATABASETYPE  SMALLINT NOT NULL ,
                MAXTXDURATION  INTEGER NOT NULL ,
                MAXRESULTSETSIZE  INTEGER NOT NULL ,
                ALLOWTRUSTEDLOGON  SMALLINT NOT NULL ,
                DOCROUTINGUPDATE  INTEGER NOT NULL ,
                DOCROUTINGFREQ  SMALLINT NOT NULL ,
                PLATFORM SMALLINT NOT NULL ,
                SYSTIMEOUT SMALLINT NOT NULL ,
                TIEUSERID NCHAR(175) CCSID 37 DEFAULT NULL ,
                TIEPASSWORD  CHAR(72) FOR BIT DATA DEFAULT NULL ,
                DATABASENAME  NVARCHAR2(128) CCSID 37 NOT NULL ,
                DBSCHEMANAME  NVARCHAR2(128) CCSID 37 NOT NULL ,
                TRACEFILENAME  NVARCHAR2(128) CCSID 37 DEFAULT NULL ,
                ENCRYPTIONKEY  VARCHAR(128) FOR BIT DATA NOT NULL ,
                KEEPTRACEOPEN  SMALLINT NOT NULL ,
                MULTIPLETRACEFILES  SMALLINT NOT NULL ,
                MAXTRACEFILESIZE  INTEGER NOT NULL ,
                PATHICMROOT  NVARCHAR2(128) CCSID 37 NOT NULL ,
                PATHICMDLL NVARCHAR2(128) CCSID 37 NOT NULL ,
                SUSPENDSERVERTIME  TIMESTAMP DEFAULT NULL ,
                RMSTATUSINTERVAL  SMALLINT NOT NULL ,
                RMSTATUSTIMEOUT  SMALLINT NOT NULL ,
                TIEINTERVAL  SMALLINT NOT NULL ,
                LSCURRENTVERSION  NVARCHAR2(128) CCSID 37 NOT NULL ,
                TRACEUSER NCHAR(175) CCSID 37 DEFAULT NULL ,
                DIMSGDIGESTALGO  SMALLINT NOT NULL DEFAULT 0 ,
                DIENCRYPTIONALGO  SMALLINT NOT NULL DEFAULT 0 ,
                CONSTRAINT JCR.ICMSTSYSCONTROLPK PRIMARY KEY( LIBRARYSERVERID ) )
                ;

この問題をどのように解決しますか?

答え1

そしてsed

sed '/CCSID/ { s/ CHAR(/ NCHAR(/; s/ VARCHAR(/ NVARCHAR2(/ }' file
  • 最初のパターンはCCSID。その後、内部部分が{...}適用される。
    • s/ CHAR(/ NCHAR(/;CHAR((先行スペースを含む)をに変更してくださいNCHAR(
    • s/ VARCHAR(/ NVARCHAR2(/VARCHAR(に置き換えられましたNVARCHAR2(

答え2

perl -pe '/CCSID/ and s/\bCHAR\b/N$&/ || s/\bVARCHAR\b/N$&2(/' file 

関連情報