CCSID
私がしなければならないのは、このファイル内で検索して見つけたものです。CCSID
そのCHAR
行のはに変わり、その行のNCHAR
はVARCHAR
に変更する必要があります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