Aparar uma parte se for igual a outra parte?

2

Eu uso uma string de atribuição de cotação de e-mail assim:

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

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

Quando nenhum nome real é fornecido (ou até mesmo 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, eu quero remover a parte ([email protected]) , deixando-me apenas com:

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

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

Eu sei que a linha de atribuição é a primeira linha não em branco após a primeira linha em branco da entrada, e não me importo de codificar com firmeza o meu formato de linha de atribuição preferido. Simplesmente excluir a parte em paranthesises é trivial, mas como fazê-lo somente quando é igual ao que o precede? Preferencialmente sem arriscar alterar qualquer outra coisa no email (arquivo de texto).

    
por a CVn 16.04.2013 / 11:41

2 respostas

3

Basta substituir a substring contendo 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+)) \(\)//'

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]:
    
por 16.04.2013 / 11:48
0
perl -lane 'print "($F[07]):" eq "$F[8]" ? "@F[0..7]:" : "@F"'

Esse forro de Perl irá dividir a string em espaços, então a string seguinte 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 dos remetentes) e, se forem iguais, part8 será removido. deixando você com:

On dd mmm yyyy hh:mm +hhmm, from [email protected]:
    
por 11.05.2013 / 02:37