【问题标题】:Swapping mupltiple words and numbers that occur in one line using SED使用 SED 交换一行中出现的多个单词和数字
【发布时间】:2019-09-15 10:18:06
【问题描述】:

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

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/'

但是,它没有帮助。

我将不胜感激!

【问题讨论】:

    标签: shell sed scripting


    【解决方案1】:

    从您的示例来看,您的 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/'
    

    【讨论】:

    • 谢谢你的回复,你能帮我解决这个问题吗.. 如果我在开始和结束时有单词和数字,我该怎么做?例如:“MS-MSG OCCUPY 12 EVERY PIC 32(12) 0012345”我试过 `` sed -r 's/(OCCUPY[0-9]+) (EVERY+) (PIC[AZ]([AZ][0- 9])+)/\3 \1 \2/'​​ `` ,但没用
    • 谢谢你的回复,我才看到!绝对有帮助!!我试图使用您的脚本,但是在某些行中,单词正在分裂,并且脚本没有因此而改变:OCCUPY 12 EVERY PIC 32(12) 因此,OCCUPY 12 EVERY 在一行中,PIC 32(12) 在下面一行。 ..你可能知道如何改变这个吗?非常感谢您的帮助!
    • 我不确定你的意思是输入行被分成两行(我的脚本还没有准备好的情况),还是我的脚本正在拆分行(我不明白为什么它会)。无论如何,我想您应该在 S.O. 上提出另一个问题,提供有关输入、实际输出和期望输出的完整详细信息。
    【解决方案2】:

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

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

    【讨论】:

    • 这个命令只对d文件有效?我想在我的文件上试试这个。例如,如果我有“ MS-MSG OCCUPY 12 EVERY PIC 32(12) 0012345”?
    • 用你的文件名替换d
    猜你喜欢
    • 2019-09-18
    • 2012-04-23
    • 2014-09-27
    • 2013-03-21
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2011-03-17
    • 2015-04-03
    相关资源
    最近更新 更多