从sed订购文本输出

时间:2013-03-14 13:30:36

标签: sed awk

我在下面有以下文字:

 FLAGS (\Seen \Flagged))
* 1001 FETCH (BODY[HEADER.FIELDS (message-id subject)] {167}
Message-ID: ail test 13
Subject: =?utf-8?Q?RDM=20Request=20RD00001578:=20Under=20Review=20->=20Requested?=

 FLAGS (\Seen \Flagged))
* 1010 FETCH (BODY[HEADER.FIELDS (message-id subject)] {145}
Subject: RE: ail test 12
Message-ID: <81B1DDBBD5E5D148915DBDF77378184D1036F5CD1B@xxxxxxxxxxxxxxxxxxxxxxxxx>


 FLAGS (\Seen \Flagged))
* 1020 FETCH (BODY[HEADER.FIELDS (message-id subject)] {116}
Subject: RE: ail test 14
Message-ID: <8A20A6EF23B11D41A1B3222195A1B2683AD3D013@xxxxxxxxxxxxxxxxxxxxxxxxx>

如何使用sedawk来获取格式如下:

Subject : the subject
Message-ID: The message ID

我知道如何获取字段,我的主要问题是将主题必须首先出现在message-id的所需顺序。

编辑:

S.O。是(uname -a)SunOS serverName 5.9 Generic_122300-61 sun4u sparc SUNW,Sun-Fire-15000

5 个答案:

答案 0 :(得分:2)

使用GNU awk(用于gensub()):

$ awk -v RS= '{
    print gensub(/.*\n(Subject[^\n]+).*/,"\\1","")
    print gensub(/.*\n(Message[^\n]+).*/,"\\1","")
}' file
Subject: =?utf-8?Q?RDM=20Request=20RD00001578:=20Under=20Review=20->=20Requested?=
Message-ID: ail test 13
Subject: RE: ail test 12
Message-ID: <81B1DDBBD5E5D148915DBDF77378184D1036F5CD1B@xxxxxxxxxxxxxxxxxxxxxxxxx>
Subject: RE: ail test 14
Message-ID: <8A20A6EF23B11D41A1B3222195A1B2683AD3D013@xxxxxxxxxxxxxxxxxxxxxxxxx>

你可以在任何带有match()+ substr()或几个sub()而不是gensub()的awk中做同样的事情。

答案 1 :(得分:1)

按顺序打印值:

$ awk '/^Subject:/{s=$0}/^Message-ID:/{m=$0}s&&m{print s"\n"m"\n";s=0;m=0}' file
Subject: =?utf-8?Q?RDM=20Request=20RD00001578:=20Under=20Review=20->=20Request...
Message-ID: ail test 13

Subject: RE: ail test 12
Message-ID: <81B1DDBBD5E5D148915DBDF77378184D1036F5CD1B@xxxxxxxxxxxxxxxxxxxxxx...

Subject: RE: ail test 14
Message-ID: <8A20A6EF23B11D41A1B3222195A1B2683AD3D013@xxxxxxxxxxxxxxxxxxxxxxxxx>

答案 2 :(得分:1)

段落模式(-00)中使用

perl -00 -lne '
    ($subject) = $_ =~ m/Subject:\s*(.*)/;
    ($message) = $_ =~ m/Message-ID:\s*(.*)/;
    print "Subject: $subject\nMessage-ID: $message"
' input.txt

输出

Subject: =?utf-8?Q?RDM=20Request=20RD00001578:=20Under=20Review=20->=20Requested?=
Message-ID: ail test 13

Subject: RE: ail test 12
Message-ID: <81B1DDBBD5E5D148915DBDF77378184D1036F5CD1B@xxxxxxxxxxxxxxxxxxxxxxxxx>

Subject: RE: ail test 14
Message-ID: <8A20A6EF23B11D41A1B3222195A1B2683AD3D013@xxxxxxxxxxxxxxxxxxxxxxxxx>

注意

来自perldoc perlrun

  

-0 [八进制/十六进制]

     

将输入记录分隔符($ /)指定为八进制或十六进制数   特殊值00将导致Perl在段落模式下粘贴文件。任何值0400或更高将导致Perl整个文件,但按照惯例,值0777是通常用于此目的的。

答案 3 :(得分:0)

如果您允许自己多次阅读该文件,则无需sed awk

grep '^Subject:' your_file | paste -d "\n" - <(grep '^Message-ID' your_file)

如果您希望记录之间有空行:

grep '^Subject:' your_file | paste -d "\n" - <(grep '^Message-ID' your_file) | sed -e '3,$s/^Subject:/\n&/'

请注意,如果文件在读取时可能会发生变化,则无效。

答案 4 :(得分:0)

sed中,这有点棘手:

sed -n -e '/^Subject:/H;/^Message-ID:/H' \
    -e 'x' \
    -e '/\nSubject:.*\n.*/{s/^\n//;p;s/.*//}' \
    -e '/\nMessage-ID:.*\n.*/{s/^\n\(.*\)\n\(.*\)/\2\n\1/;p;s/.*//}' \
    -e 'x' \
    your_file

这个脚本的想法如下:

  1. Subject: Message-ID:的{​​{1}}行保留在保留空间(第一-e)。
  2. 为每一行做#1,在阅读记录后,我们将在保留空间中设置\nSubject:.*\n.*\nMessage-ID:.*\n.*
  3. 使用保留空间很容易获得预期的输出。