正则表达式 - 将特定字符串后的数字替换为没有最后一位的相同数字,如果小于 16,则替换为 16

regex - Replace a number after specific strings by same number without last digit and by 16 if it is lower than 16

我对正则表达式感兴趣,它可以用没有最后一位的相同数字替换 Informix 脚本文件中的数字(即用 89 替换 893),但如果结果数字小于 16,则应将其替换为 16(即143 应替换为 16)。这些数字总是出现在特定字符串之后("extent size" 和 "next size")。

我试过使用 sed 和 awk 但没有成功:(。你能帮我吗?

我不在乎它是否是一种在 Notepad++ 上使用正则表达式替换或在 Linux 或 UNIX shell.

中处理文件的方法

基本上:extent size 20614 next size 46 lock mode row 必须替换为 extent size 2061 next size 16 lock mode row。 并且必须在所有 "extent size" 和 "next size" 数字中完成(并且没有其他数字)

这是示例代码:

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";

提前致谢。

太久没读完,但你可以用 awk 做到这一点

awk '{v=int(/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' 
perl -MList::Util=max -pe 's{(?:extent|next) size \K(\d*)\d\b}{max , 16}eg' file.sql

这可能对你有用 (GNU sed):

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

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