Sed
在linux中的文件中使一個重複的字元串唯一
我有一個這樣的文件prueba.ldif:
dn: EpsStaInfId=EpsStaInf,serv=EPS,mscId=0015f5e3d05d4d52b0cb85db69474db3,ou=multiSCs,dc=three structuralObjectClass: EpsStaticInf objectClass: EpsStaticInf entryDS: 1 nodeId: 21 createTimestamp: 20220303153032Z modifyTimestamp: 20220303153032Z EpsStaInfId: EpsStaInf EpsProfileId: 10 EpsOdb: 0 EpsRoamAllow: TRUE CDC: 1 EpsIndDefContextId: 1 EpsIndAmbrMaxUl: 320000000 EpsIndAmbrMaxDl: 1024000000 EpsRoamRestrict: TRUE EpsTenantId: 1 EpsIndContextId: 1 EpsIndContextId: 2 dn: EpsStaInfId=EpsStaInf,serv=EPS,mscId=0040fb1140104f9fbc4be38be3db5965,ou=multiSCs,dc=three structuralObjectClass: EpsStaticInf objectClass: EpsStaticInf entryDS: 1 nodeId: 21 createTimestamp: 20220301120221Z modifyTimestamp: 20220301120221Z EpsStaInfId: EpsStaInf EpsProfileId: 10 EpsOdb: 0 EpsRoamAllow: TRUE CDC: 1 EpsIndDefContextId: 1 EpsIndAmbrMaxUl: 320000000 EpsIndAmbrMaxDl: 1024000000 EpsRoamRestrict: TRUE EpsTenantId: 1 EpsIndContextId: 1 EpsIndContextId: 5 EpsIndContextId: 15
我想為每個dn設置唯一的EpsIndContextId,在末尾添加一個數字,結果得到一個像這樣的文件:
dn: EpsStaInfId=EpsStaInf,serv=EPS,mscId=0015f5e3d05d4d52b0cb85db69474db3,ou=multiSCs,dc=three structuralObjectClass: EpsStaticInf objectClass: EpsStaticInf entryDS: 1 nodeId: 21 createTimestamp: 20220303153032Z modifyTimestamp: 20220303153032Z EpsStaInfId: EpsStaInf EpsProfileId: 10 EpsOdb: 0 EpsRoamAllow: TRUE CDC: 1 EpsIndDefContextId: 1 EpsIndAmbrMaxUl: 320000000 EpsIndAmbrMaxDl: 1024000000 EpsRoamRestrict: TRUE EpsTenantId: 1 EpsIndContextId1: 1 EpsIndContextId2: 2 dn: EpsStaInfId=EpsStaInf,serv=EPS,mscId=0040fb1140104f9fbc4be38be3db5965,ou=multiSCs,dc=three structuralObjectClass: EpsStaticInf objectClass: EpsStaticInf entryDS: 1 nodeId: 21 createTimestamp: 20220301120221Z modifyTimestamp: 20220301120221Z EpsStaInfId: EpsStaInf EpsProfileId: 10 EpsOdb: 0 EpsRoamAllow: TRUE CDC: 1 EpsIndDefContextId: 1 EpsIndAmbrMaxUl: 320000000 EpsIndAmbrMaxDl: 1024000000 EpsRoamRestrict: TRUE EpsTenantId: 1 EpsIndContextId1: 1 EpsIndContextId2: 5 EpsIndContextId3: 15
我怎樣才能做到這一點?
這是一個
sed
解決方案:
sed -E 's/(^EpsIndContextId)(:) (.*$)/\1\3\2 \3/' prueba.ldif
與
perl
:perl -pe '$i = 0 if /^dn:/; s/^EpsIndContextId\K/++$i/e' < prueba.ldif
或編輯文件
i
n-place:perl -i -pe '$i = 0 if /^dn:/; s/^EpsIndContextId\K/++$i/e' prueba.ldif
上面,每當遇到以 開頭的行時,我們都會重置計數器
dn:
。您可以if /^dn:/
改為if /^$/
搜尋空行或unless /\S/
搜尋空行(僅由空白字元組成的行),或者正如@glennjackman 建議的那樣,使用段落模式,-00
其中記錄而不是行,由序列分隔一個或多個空行(2 個或多個換行符),並使用m
替換中的標誌^
來匹配主題(段落)中每一行的開頭,而不是僅在主題的開頭和g
標誌替換每個記錄中出現:perl -00 -pe '$i = 0; s/^EpsIndContextId\K/++$i/emg' < prueba.ldif