ある部分が別の部分と等しい場合、それをトリミングしますか?

ある部分が別の部分と等しい場合、それをトリミングしますか?

私は次のような電子メール引用属性文字列を使用します。

On dd mmm yyyy hh:mm +hhmm, from [email protected] (Example Dot Org):

[email protected]送信者の電子メール アドレス、Example Dot Orgは送信者の本名です。

実名が提供されていない場合 (または、実名が提供されている場合でも)、2 つは同一であり、次のような帰属文字列になります。

On dd mmm yyyy hh:mm +hhmm, from [email protected] ([email protected]):

これが当てはまる場合(そしてその場合のみ)、その部分を削除して、次の部分のみを残します。([email protected])

On dd mmm yyyy hh:mm +hhmm, from [email protected]:

私はすでに、メールをエディタに送る前にPerlを呼び出してメールを加工するシェルスクリプトを持っています。それにコードを追加して、帰属行も加工できるのではないかと考えています。この解決策は、Perl、awk、sed、または他の何かで行うことができます(ただし、あまりにもエキゾチック)。

属性行は入力の最初の空白行に続く最初の非空白行であることはわかっていますし、私が好む属性行の形式にハードコーディングしてもかまいません。括弧内の部分を削除するだけで済みますが、前のものと等しい場合にのみそれを実行するにはどうすればよいでしょうか?できれば、電子メール (テキスト ファイル) 内の他の部分を変更するリスクがないことが望まれます。

答え1

アドレスが 2 回出現する部分文字列を、アドレスが 1 つだけ含まれる部分文字列の最初の半分に置き換えるだけです。

bash-4.2$ echo '
On dd mmm yyyy hh:mm +hhmm, from [email protected] (Example Dot Org):
On dd mmm yyyy hh:mm +hhmm, from [email protected] ([email protected]):
On dd mmm yyyy hh:mm +hhmm, from [email protected]:
' | sed -r 's/(, from (\S+)) \(\2\)/\1/'

On dd mmm yyyy hh:mm +hhmm, from [email protected] (Example Dot Org):
On dd mmm yyyy hh:mm +hhmm, from [email protected]:
On dd mmm yyyy hh:mm +hhmm, from [email protected]:

答え2

perl -lane 'print "($F[07]):" eq "$F[8]" ? "@F[0..7]:" : "@F"'

この Perl ワンライナーは文字列をスペースで分割するため、次の文字列は 9 つの部分に分割されます。

On dd mmm yyyy hh:mm +hhmm, from [email protected] ([email protected]):

パート 8 (電子メール アドレス) とパート 9 (送信者名) を比較し、同じ場合はパート 8 が削除されます。次のようになります。

On dd mmm yyyy hh:mm +hhmm, from [email protected]:

関連情報