1

以下のテキストがあります。

 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

私はフィールドを取得する方法を知っています。私の主な問題は、件名が常にメッセージ ID の最初に来なければならない順序を設定することです。

編集:

SO は ( uname -a ) SunOS serverName 5.9 Generic_122300-61 sun4u sparc SUNW,Sun-Fire-15000

4

5 に答える 5

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>

gensub() の代わりに match()+substr() またはいくつかの sub() を使用して、任意の awk で同じことを行うことができます。

于 2013-03-14T13:52:57.207 に答える
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>
于 2013-03-14T13:32:52.923 に答える
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[8進数/16進数]

入力レコード区切り記号 ($/) を 8 進数または 16 進数で指定します。
特別な値 00 により、Perl は段落モードでファイルを丸呑みします。0400 以上の値を指定すると、Perl はファイル全体を丸飲みしますが、慣例により、この目的で通常使用される値は 0777 です。

于 2013-03-14T13:36:01.953 に答える
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. から始まる行をホールドスペース(1番目)に格納Subject:Message-ID:ます-e
  2. 各行に対して#1を実行し、レコードを読み取った後、\nSubject:.*\n.*または\nMessage-ID:.*\n.*保留スペースに入れます。
  3. ホールドスペースを操作すると、期待される出力を簡単に取得できます。
于 2013-03-14T15:09:48.793 に答える
0

ファイルを複数回読み取ることができる場合は、 sedof は必要ありません。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&/'

読み取り中にファイルが変更される可能性がある場合、これは機能しないことに注意してください。

于 2013-03-14T14:53:58.633 に答える