正则表达式 - 将特定字符串后面的数字替换为相同的数字而不是最后一位数字,如果它低于16

时间:2015-11-05 17:19:12

标签: regex awk sed notepad++ informix

我感兴趣的是正则表达式将Informix脚本文件中的数字替换为相同的数字而没有最后一位数字(即将893替换为89),但如果结果数字低于16则应将其替换为16(即143应该被16)取代。这些数字总是在特定字符串之后("范围大小"和"下一个大小")。

我尝试用sed和awk但没有运气:(。你可以帮我吗?

我不在乎是否可以在Notepad ++上使用正则表达式替换,或者在Linux或UNIX shell中使用该文件。

基本上:扩展区大小20614下一个大小46锁定模式行必须替换为扩展区大小2061下一个大小16锁定模式行。 而这必须在所有"范围大小"和"下一个尺寸"数字(与其他数字无关)

这是一个示例代码:

grant dba to "dbauser";
grant connect to "showgex";
grant connect to "dangerpro";

{ TABLE "dbauser".a_trasladar row size = 61 number of columns = 20 index size = 
31 }
create table "dbauser".a_trasladar 
(
numicu integer 
default 0,
numerohc integer 
default 0,
ncama char(6) 
default '',
sexo smallint 
default 0,
edad smallint 
default 0,
serv_actu char(4) 
default '',
unenf_actu char(4) 
default '',
serv_dest char(4) 
default '',
unenf_dest char(4) 
default '',
tipo_tras smallint 
default 0,
bloqueo char(1) 
default '',
medidest integer 
default 0,
fechatras date,
horatras smallint 
default 0,
cambiode char(1),
intercam char(1),
ectoactu char(1),
camadest char(6) not null ,
ectodest char(1),
mediactu integer
) extent size 16 next size 16 lock mode row;

revoke all on "dbauser".a_trasladar from "public" as "dbauser";

{ TABLE "dbauser".a_wx_p row size = 13 number of columns = 2 index size = 0 }
create table "dbauser".a_wx_p 
(
awx_proceso integer not null ,
awx_numest char(9)
) extent size 16 next size 16 lock mode row;

revoke all on "dbauser".a_wx_p from "public" as "dbauser";


create table "dbauser".ac_trab 
(
numicu integer 
default 0,
nom_empresa char(30) 
default '',
dom_empresa char(30) 
default '',
pob_empresa integer 
default 0,
prov_empresa smallint 
default 0,
telef char(15) 
default '',
telex char(15) 
default '',
cod_post_e integer 
default 0,
num_exp integer,
numerohc integer,
num_afi char(14)
) extent size 418 next size 95 lock mode row;

revoke all on "dbauser".ac_trab from "public" as "dbauser";




{ TABLE "dbauser".age_activ row size = 40 number of columns = 6 index size = 21 
}
create table "dbauser".age_activ 
(
idagenda char(6) not null ,
fecha date not null ,
codipres char(6) not null ,
cantidad smallint,
hora_ini char(11),
hora_fin char(11)
) extent size 40 next size 16 lock mode row;

revoke all on "dbauser".age_activ from "public" as "dbauser";


{ TABLE "dbauser".admerror row size = 72 number of columns = 2 index size = 7 }
create table "dbauser".admerror 
(
coderror smallint 
default 0,
descripcion char(70) 
default ''
) extent size 16 next size 16 lock mode row;

revoke all on "dbauser".admerror from "public" as "dbauser";



create table "dbauser".h_lespadm 
(
nfila integer 
default 0,
tipolis smallint 
default 0,
f_baja date,
motivo smallint 
default 0,
numhc integer 
default 0,
servreal char(4) 
default '',
codmedic integer 
default 0,
f_inclu date,
avisincl char(1) 
default '',
codidiag char(6) 
default '',
descdiag char(60) 
default '',
codiproc char(6) 
default '',
descproc char(60) 
default '',
tipoanest char(2) 
default '',
prioridad smallint 
default 0,
origen smallint 
default 0,
servpeti char(4) 
default '',
medipeti integer 
default 0,
f_limite date,
observ char(140) 
default '',
tipfinan smallint 
default 0,
garante char(6) 
default '',
ambito char(1) 
default '',
preingre smallint 
default 0,
pteavimod smallint 
default 0,
antfingre date,
camaingr char(6) 
default '',
f_ingre date,
f_avising date,
avisingr char(1) 
default '',
f_avismes date,
f_avissem date,
procedede smallint,
numproce integer,
razon_medica char(1) 
default 'N',
hemoterapia char(1) 
default 'N',
complicacion char(1) 
default 'N',
concertado char(1) 
default 'N',
inclusion smallint 
default 1,
fec_noconc date,
fec_rmedica date,
codidiag2 char(6),
descdiag2 char(60),
preoperatorio char(1) 
default 'N',
numpetd integer 
default 0,
fecpreop date,
comp_asa smallint,
auto_trans char(1),
codiproc2 char(6),
descproc2 char(60),
plan_sergas char(1),
fpres date,
centro char(4),
decreto_ga char(1),
codnivel char(20),
cupopeticionario char(8),
idcodigod1 integer,
idcodigop1 integer,
idcodigod2 integer,
idcodigop2 integer,

check (razon_medica IN ('S' ,'N' )),

check (hemoterapia IN ('S' ,'N' )),

check (complicacion IN ('S' ,'N' )),

check (concertado IN ('S' ,'N' ))
) extent size 20610 next size 4684 lock mode row;

revoke all on "dbauser".h_lespadm from "public" as "dbauser";


{ TABLE "dbauser".top_dcontrol row size = 127 number of columns = 15 index size 
= 29 }
create table "dbauser".top_dcontrol 
(
con_accion smallint,
con_objeto smallint,
con_uid integer,
con_fecha date,
con_hora char(11),
con_campo1 integer,
con_campo2 integer,
con_campo3 integer,
con_campo4 integer,
con_campo5 char(20),
con_campo6 char(20),
con_campo7 char(20),
con_campo8 char(20),
con_campo9 date,
con_campo10 date
) extent size 160191 next size 36407 lock mode row;

revoke all on "dbauser".top_dcontrol from "public" as "dbauser";



grant select on "dbauser".a_trasladar to "public" as "dbauser";
grant update on "dbauser".a_trasladar to "public" as "dbauser";
grant insert on "dbauser".a_trasladar to "public" as "dbauser";
grant delete on "dbauser".sit_paci to "public" as "dbauser";


create index "usrisac".gac_cabecera_fh on "dbauser".gac_cabecera 
(fechahora) using btree in datdbsclinfor;
create index "dbauser".gac_cabecerai on "dbauser".gac_cabecera 
(numicu,codregistro,fechaeliminacion) using btree in datdbsclinfor;

create unique index "dbauser".ix422_1 on "dbauser".gac_proculcera 
(codigo) using btree in datdbsclinfor;
create index "dbauser".gac_viasperi on "dbauser".gac_viasperifer 
(numicu,fecharet) using btree in datdbsclinfor;


create trigger "dbauser".tg_upd_urg_local_our update on "dbauser"
.obse_local referencing old as ant new as post
for each row
when (((ant.fechaf IS NULL ) AND (post.fechaf IS NOT 
NULL ) ) )
(
update "dbauser".urg_local set "dbauser".urg_local.libre 
= 0 where (codigo = ant.localiza ) );

grant select on "dbauser".sql_languages to "public" with grant option as "dbauser";
grant select on "dbauser".server_info to "public" with grant option as "dbauser";
grant select on "derivada".garantes to "public" as "derivada";




create procedure "dbauser".typelength(type smallint, len smallint)
returning smallint;
define result smallint;
if type in (5, 8) then
let result = len / 256;
else
let result = len;
end if;
return result;
end procedure
;create trigger "derivada".tg_inspaci insert on "dbauser".pacientes 
referencing new as post
for each row
(
insert into "derivada".top_control (con_accion,con_objeto,
con_uid,con_fecha,con_hora,con_campo1,con_campo5,con_campo6,con_campo7,
con_campo8,con_campo9) values ('1' ,'1' ,(select min(x0.us_ccu ) from 
"dbauser".us_usuarios x0 where (((x0.us_nombre = USER ) OR (x0.us_nombre 
= LOWER(USER ) ) ) OR (x0.us_nombre = UPPER(USER ) ) ) ) ,CURRENT 
year to day ,CURRENT hour to minute ,post.numerohc ,post.nombre ,
post.apellid1 ,post.apellid2 ,((((post.numeross1 || '-' ) || post.numeross2 
) || '-' ) || post.numeross3 ) ,post.fechanac )),
(
execute procedure "derivada".pa_inapl_censo_paciente(post.numerohc 
,0 ));


grant select on "dbauser".sql_languages to "public" with grant option as "dbauser";
grant select on "dbauser".server_info to "public" with grant option as "dbauser";
grant select on "derivada".garantes to "public" as "derivada";
grant select on "derivada".vpersonalexterno to "public" as "derivada";

提前致谢。

3 个答案:

答案 0 :(得分:2)

太久没读了但是用awk可以做到这一点

awk '{v=int($1/10);print v<16?16:v}'

好的,awk救援!

awk '/extent size/ || /next size/ 
       {for(i=1;i<NF-1;i++) 
          if($i~/extent|next/ && $(i+1)~/size/) 
             {v=int($(i+2)/10); 
              $(i+2)=v<16?16:v
              } 
       } 1' 

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -r '/((extent|next) size )([0-9]*)[0-9]\>/!b;s//\1\n\3\n/g;s/\n(1[0-5])\n|\n[1-9]\n/16/g;s/\n//g' file

使用正则表达式将所需数字减少一位数,同时将这些数字与标记隔离,如果剩余的数字小于16,则替换为16.完成后删除标记。

答案 2 :(得分:0)

perl -MList::Util=max -pe 's{(?:extent|next) size \K(\d*)\d\b}{max $1, 16}eg' file.sql