Linux의 파일에서 중복 문자열을 고유하게 만들기

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

어떻게 해야 하나요?

답변1

그리고 perl:

perl -pe '$i = 0 if /^dn:/; s/^EpsIndContextId\K/++$i/e' < prueba.ldif

또는 파일을 in-place 편집하십시오.

perl -i -pe '$i = 0 if /^dn:/; s/^EpsIndContextId\K/++$i/e' prueba.ldif

dn:위에서는 로 시작하는 줄을 만날 때마다 카운터를 재설정합니다. 대신 빈 줄을 if /^dn:/검색 하거나 빈 줄(공백 문자로만 구성된 줄)을 검색하거나 @glennjackman이 제안한 대로 줄 대신 레코드가 하나 이상의 빈 줄(2개 이상)로 구분되는 단락 모드를 사용할 수 있습니다. 개행), 주제의 시작 부분과 각 레코드의 항목을 대체하는 플래그 대신 주제(단락)의 각 줄의 시작 부분과 일치 하도록 대체 플래그를 사용합니다.if /^$/unless /\S/-00m^g

perl -00 -pe '$i = 0; s/^EpsIndContextId\K/++$i/emg' < prueba.ldif

답변2

해결책 은 다음과 같습니다 sed.

sed -E 's/(^EpsIndContextId)(:) (.*$)/\1\3\2 \3/' prueba.ldif

답변3

POSIX awk:

awk '/^dn: /{c=0} /^EpsIndContextId/{sub(/^EpsIndContextId/, "&"++c)} 1' test

카운터( c)와 각 섹션의 시작 부분( )을 재설정하므로 dn카운터를 찾을 때마다 EpsIndContextId카운터가 증가하여 이 섹션에 추가됩니다.

또는@에드모튼제안:

awk '/^dn: /{c=0} sub(/^EpsIndContextId/, "&"c+1){c++} 1' test

동일한 정규식을 두 번 사용하지 않도록 합니다.

관련 정보