如果一个部分等于另一部分,则修剪另一部分?

如果一个部分等于另一部分,则修剪另一部分?

我使用这样的电子邮件引用归属字符串:

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

其中[email protected]是发件人的电子邮件地址,Example Dot Org是发件人的真实姓名。

当没有提供真实姓名时(甚至有时提供真实姓名时),两者是相同的,我最终得到如下的归因字符串:

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

如果(且仅当)是这种情况,我想删除该部分,只留下:([email protected])

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

我已经有一个 shell 脚本,它在将电子邮件提供给我的编辑器之前调用 Perl 来处理电子邮件,并且我想我可以简单地向其中添加一些代码来处理归因行。解决方案可以用 Perl、awk、sed 或其他东西来完成(尽管最好不是用其他东西)异国情调)。

我确实知道归因行是输入的第一个空行之后的第一个非空行,并且我不介意针对我喜欢的归因行格式进行硬编码。简单地删除括号中的部分是微不足道的,但是仅当它等于它之前的值时如何做到这一点?最好不要冒险更改电子邮件(文本文件)中的其他任何内容。

答案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 one liner 会按空格分割字符串,因此以下字符串将被分割成 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]:

相关内容