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

时间:2019-04-25 22:37:45

标签: 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附近有不同的数字。

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

sed -E 's/(.*OCCUPY\ )(0([A-Z]\([0-9])\)(.*EVERY\ )(.*PIC\ )(([0-9]\([0-9]+\))/\3\4\1\2/'
sed -E 's/((OCCUPY )([A-Z]\([0-9]))\)(.*EVERY )(.*PIC)(([0-9]\([0-9]))/\3\4\1\2/'

但是,它没有帮助。

我将不胜感激!

2 个答案:

答案 0 :(得分:5)

根据您的示例判断,您的sed命令似乎过于复杂。那这个简单的版本呢?

sed 's/\(.*\) \(PIC .*\)/\2 \1/'

[更新]您的台词比帖子中所说的要复杂。他们就像:

MS-MSG OCCUPY 12 EVERY PIC 32(12) 0012345

你想要的

PIC 32(12) OCCUPY 12 EVERY

然后,您所要做的就是将那些多余的字符添加到替换命令的左侧,但在外部括号中(其内容用于构建新字符串):

sed 's/.* \(OCCUPY .*\) \(PIC [^ ]*\).*/\2 \1/'

答案 1 :(得分:1)

如果您的数据位于d文件中,请尝试使用gnu sed:

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