Обрезать одну часть, если она равна другой части?

Обрезать одну часть, если она равна другой части?

Я использую следующую строку атрибуции цитаты по электронной почте:

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]:

У меня уже есть скрипт оболочки, который вызывает 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 разделит строку по пробелам, так что следующая строка будет разделена на 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]:

Связанный контент