패턴이 연속으로 한 번만 나타나면 출력을 얻을 수 있습니다. 다음 명령을 사용하십시오.
sed 's/\(.*\)\(\.T\/[^.]*\)/\2,\1/;s/\(.*\)\(\.X\/[^.]*\)/\2\1/' file
입력하다:
1991/10/15,DFD.T/SDFDS.Z/9887/15MAR/DFC/I.X/918875797553.G/IUYT/1/453.H/LPJB
1991/10/15,DFD.T/RUDFR.Z/9887/15MAR/DFC/I.X/918875797554.G/IUYT/1/453.H/LPJB
예상 출력:
.X/918875797553.T/SDFDS,1991/10/15,DFD.Z/9887/15MAR/DFC/I.G/IUYT/1/453.H/LPJB
.X/918875797554.T/RUDFR,1991/10/15,DFD.Z/9887/15MAR/DFC/I.G/IUYT/1/453.H/LPJB
하지만 수학 패턴이 동적으로 반복되는 경우 낙관적인 솔루션을 제안해 주세요.
1991/10/15,SUN.T/IUDFW.Z/0136/15MAR/KWW/I.X/918875797554.X/918875797550.X/918875797558.G/PLMW/1/SPI.H/XZTK.
1991/10/15,SUN.T/IUDFW.Q/0136/15SEP/KWW/I.X/918875797557.X/918875797550.X/918875797558.X/918875797559.W/PLMW/1/SPI.H/XZTK.
1991/10/15,SUN.T/BJYE.Z/0136/03MAR/KWW/I.X/918875797551.L/PLMW/1/SPI.H/XZTK.
아래와 같은 출력이 필요합니다.
.X/918875797554.X/918875797550.X/9188757975581.T/IUDFW,991/10/15,SUN.Z/0136/15MAR/KWW/I.G/PLMW/1/SPI.H/XZTK.
.X/918875797557.X/918875797550.X/918875797558.X/918875797559.T/IUDFW,1991/10/15,SUN.Q/0136/15SEP/KWW/I.W/PLMW/1/SPI.H/XZTK.
.X/918875797551.T/BJYE,1991/10/15,SUN.Z/0136/03MAR/KWW/I.L/PLMW/1/SPI.H/XZTK.
답변1
이러한 문제의 경우 과도한 백슬래시와 \{1,\}가 정규식의 가독성에 영향을 주지 않도록 확장 정규식 모드(-E)에서 GNU sed를 호출하는 것이 좋습니다. 또한 이동할 블록을 분리한 후 s/// 명령을 여러 번 호출하여 한 번에 한 블록씩 이동함으로써 이를 수행할 수 있습니다.
sed -Ee '
s|\.T/[^.]+|\n&\n|
s|(.*)\n(.*)\n|\2,\1|
s|(\.X/[^.]+)+|\n&\n|
s|(.*)\n(.*)\n|\2\1|
' file
첨부된: 선행 공백이 오타라고 가정합니다. 또한 출력이 다중 모달 시나리오의 첫 번째 줄 입력과 일치하지 않습니다.
답변2
예를 들어 다음과 같이 작동합니다.
$ sed 's:\([^.]*\)\.\([^.]*\)\.\([^.]*[A-Z]\)\([.X0-9/]*\)\(.*\)$:\4\2,\1.\3.\5:'
비교해 봅시다:
# OP's
.X/918875797554.X/918875797550.X/9188757975581.T/IUDFW,991/10/15,SUN.Z/0136/15MAR/KWW/I.G/PLMW/1/SPI.H/XZTK.
.X/918875797557.X/918875797550.X/918875797558.X/918875797559.T/IUDFW,1991/10/15,SUN.Q/0136/15SEP/KWW/I.W/PLMW/1/SPI.H/XZTK.
.X/918875797551.T/BJYE,1991/10/15,SUN.Z/0136/03MAR/KWW/I.L/PLMW/1/SPI.H/XZTK.
# command output
.X/918875797554.X/918875797550.X/918875797558.T/IUDFW,1991/10/15,SUN.Z/0136/15MAR/KWW/I.G/PLMW/1/SPI.H/XZTK.
.X/918875797557.X/918875797550.X/918875797558.X/918875797559.T/IUDFW,1991/10/15,SUN.Q/0136/15SEP/KWW/I.W/PLMW/1/SPI.H/XZTK.
.X/918875797551.T/BJYE,1991/10/15,SUN.Z/0136/03MAR/KWW/I.L/PLMW/1/SPI.H/XZTK.
첨부된:선행 공백이 오타라고 가정합니다. 또한 출력이 다중 모달 시나리오의 첫 번째 줄 입력과 일치하지 않습니다.