Cortar uma parte se for igual a outra parte?

Cortar uma parte se for igual a outra parte?

Eu uso uma string de atribuição de cotação por e-mail como esta:

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

onde [email protected]está o endereço de e-mail do remetente e Example Dot Orgé o nome real do remetente.

Quando nenhum nome real é fornecido (ou mesmo às vezes quando um é), os dois são idênticos e acabo com uma string de atribuição como esta:

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

Se (e somente se) for esse o caso, quero remover a peça, deixando-me apenas:([email protected])

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

Eu já tenho um script de shell que chama Perl para massagear o e-mail antes de enviá-lo ao meu editor, e estou pensando em simplesmente adicionar algum código a ele para massagear a linha de atribuição também. A solução poderia ser feita em Perl, awk, sed ou qualquer outra coisa (embora de preferência não algotambémexótico).

Eu sei que a linha de atribuição é a primeira linha que não está em branco após a primeira linha em branco da entrada e não me importo de codificar meu formato de linha de atribuição preferido. Simplesmente deletar a parte entre parênteses é trivial, mascomo fazê-lo somente quando for igual ao que o precede?De preferência sem correr o risco de alterar mais nada no email (arquivo de texto).

Responder1

Basta substituir a substring que contém as duas ocorrências do endereço pela primeira metade da substring, contendo apenas um endereço:

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

Responder2

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

Este liner Perl dividirá a string em espaços, então a string a seguir será dividida em 9 partes:

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

Ele irá comparar part8 (endereço de e-mail) com part9 (nome do remetente) e se forem iguais, part8 será removido. deixando você com:

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

informação relacionada