如果模式仅在一行中出现一次,我就能够获得输出。使用以下命令。
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
对于此类问题,建议在扩展正则表达式模式 (-E) 下调用 GNU sed,这样过多的反斜杠和 \{1,\} 就不会影响正则表达式的可读性。此外,我们可以在隔离要移动的块后,多次调用 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.
附:假设前导空格是一个拼写错误。此外,您的输出在多模式场景中的第一行与您的输入不匹配。