Shell 使用SED交换一行中出现的多个字和数字

Shell 使用SED交换一行中出现的多个字和数字,shell,sed,scripting,Shell,Sed,Scripting,我有一个大文件,其中每一行都显示: OCCUPY 12 EVERY PIC 32(12) OCCUPY 45 EVERY PIC X(21) OCCUPY 98 EVERY PIC F(A0) OCCUPY 21 EVERY PIC T(BC) 所需输出应为: PIC 32(12) OCCUPY 12 EVERY PIC X(21) OCCUPY 45 EVERY PIC F(A0) OCCUPY 98 EVERY 等等 所以,这只是一个例子,但是在文件中,有很多行在PIC附近有不同的

我有一个大文件,其中每一行都显示:

OCCUPY 12 EVERY PIC 32(12) 
OCCUPY 45 EVERY PIC X(21) 
OCCUPY 98 EVERY PIC F(A0)
OCCUPY 21 EVERY PIC T(BC)
所需输出应为:

PIC 32(12) OCCUPY 12 EVERY 
PIC X(21) OCCUPY 45 EVERY
PIC F(A0) OCCUPY 98 EVERY
等等

所以,这只是一个例子,但是在文件中,有很多行在PIC附近有不同的字符/数字,在account附近有不同的数字

到目前为止,我尝试执行:

sed -E 's/(.*OCCUPY\ )(0([A-Z]\([0-9])\)(.*EVERY\ )(.*PIC\ )(([0-9]\([0-9]+\))/\3\4\1\2/'
但是,这没有帮助


我将感谢任何帮助

从您的示例判断,您的sed命令似乎太复杂了。这个简单的版本怎么样

sed 's/\(.*\) \(PIC .*\)/\2 \1/'
[更新]你的台词比你在帖子中说的要复杂。它们是:

MS-MSG OCCUPY 12 EVERY PIC 32(12) 0012345
你想要:

PIC 32(12) OCCUPY 12 EVERY
然后,您所要做的就是将这些额外的字符添加到替换命令的左侧,但在括号(其内容用于构建新字符串)之外:


如果您的数据在
d
文件中,请在gnu上试用:

sed -E 's/^(OCCUPY.+EVERY).+(PIC \S+)/\2 \1/' d 

此命令仅适用于d文件?我想在我的档案里试试这个。例如,如果我有“MS-MSG占据12每一个PIC 32(12)0012345”?用您的文件名替换
d
。谢谢您的回复,您能帮我吗。。如果我在开头和结尾都有单词和数字,我该怎么做?例如:“MS-MSG占领12每一张图片32(12)0012345”我试过“sed-r/(占领[0-9]+)(每一张+)(PIC[A-Z]([A-Z][0-9])+)/\3\1\2/”,但没用谢谢你的回复,我只是看到了而已!。绝对有帮助!!我试着使用你的脚本,但是在一些行中,单词正在分裂,脚本并没有因此而改变:
occube 12 EVERY PIC 32(12)
所以,occube 12 EVERY在一行中,PIC 32(12)在下面一行中……你知道如何改变吗?谢谢你的帮助!!我不确定您的意思是输入行被拆分为两行(我的脚本还没有准备好),还是我的脚本正在拆分行(我不明白为什么会这样)。无论如何,我想你应该问另一个关于S.O.的问题,给出输入、实际输出和期望输出的全部细节。
sed 's/.* \(OCCUPY .*\) \(PIC [^ ]*\).*/\2 \1/'
sed -E 's/^(OCCUPY.+EVERY).+(PIC \S+)/\2 \1/' d