我在下面有以下文字:
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>
如何使用sed
或awk
来获取格式如下:
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
答案 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:
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>
-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
这个脚本的想法如下:
Subject:
Message-ID:
的{{1}}行保留在保留空间(第一-e
)。\nSubject:.*\n.*
或\nMessage-ID:.*\n.*
。