Converte todo o primeiro caractere em um ID de email para Maiúsculas em BASH

4

Eu preciso aceitar um ID de e-mail e um nome completo em um script e, caso o nome completo não seja fornecido, preciso gerar o nome do ID de e-mail. Algo parecido com isto:

Case 1:
EmailID: [email protected]
Full Name: User Name
Case 2:
EmailID: [email protected]
Full Name: User Name2
Case 3:
EmailID: [email protected]
Full Name: This Is A Very Long Email Id

Isso eu consegui usando as seguintes etapas:

EMAIL_ADDRESS="$1"
ID=('echo $EMAIL_ADDRESS | cut -d'@' -f1| tr '.' ' '')
NEW_ID=()
NUM=0
for IN_VAL in ${ID[@]}
do
    NEW_ID[$NUM]="'echo ${IN_VAL^}'"
    NUM=$((++NUM))
done
echo "${NEW_ID[@]}"

Estou na versão BASH 4.1.2

Eu acho que tem que haver uma maneira melhor de conseguir isso. Além disso, eu já vejo um problema neste como estou supondo que o separador de campo vai ser dot (.) E não qualquer outra coisa como sublinhado (_) ou hífen (-) ou qualquer outra coisa. Se existe uma maneira melhor de fazer isso, por favor me avise. Obrigado.

    
por AbhinavK 28.03.2015 / 09:53

2 respostas

9

Você pode fazer isso totalmente no Bash, sem comandos externos, usando divisão de palavras e expansão de parâmetros . É até relativamente curto:

[email protected]
USER=${EMAIL_ADDRESS%@*}
WORDS=( $(IFS=._- ; printf '%s ' $USER) )
echo "${WORDS[@]^}"

Vou pegar esta linha por linha:

USER=${EMAIL_ADDRESS%@*}

Isso define a variável USER como a parte de EMAIL_ADDRESS que não corresponde a @* no final, ou seja, removendo o nome de domínio e deixando apenas a parte do usuário do endereço.

WORDS=( $(IFS=._- ; printf '%s ' $USER) )

Isso cria uma inicialização de um array WORDS . Os valores iniciais são fornecidos pelos resultados da substituição do comando $(...) .

As substituições de comandos são executadas em um subshell , para que possamos alterar os valores das variáveis com segurança sem afetar seus valores em nossa casca principal. Isso inclui IFS , que é usado durante divisão de palavras como o grupo de caracteres que fazem com que uma nova palavra comece. Cada um dos . , _ e - formará um limite de palavra e você poderá adicionar novos caracteres, se desejar.

Depois de alterar o IFS , usamos printf para imprimir as palavras $USER foram divididas, o que é um pouco mais seguro que echo .

echo "${WORDS[@]^}"

Finalmente, imprimimos o resultado. A [@] é a expansão da matriz, como você sabe, e a seguir, ^ maiúsculas do primeiro caractere da palavra (estritamente, a primeira correspondência do padrão padrão ? ).

O resultado final da execução deste script é a saída:

This Is A Very Long Email Id

como esperado.

Se algum endereço de email contiver metacaracteres de shell * , ? , etc, eles serão expandidos como curingas. Você pode envolver a linha WORDS= em set -f / set +f para evitar isso, mas há outra opção (cortesia de Glenn Jackman nos comentários).

IFS=._- read -r -a WORDS <<<"${EMAIL_ADDRESS%@*}"
echo "${WORDS[@]^}"

Isso usa read -a para preencher uma matriz com os resultados de palavra splitting, e o resto (condensado) como antes. Acho isso menos claro para ler do que a inicialização explícita da matriz, mas é uma opção.

É importante notar também que os endereços de e-mail podem ter uma grande variedade de formulários , incluindo aqueles com espaços, aspas e caracteres de colchetes neles, e isso não lida com esses endereços (nem é realmente possível fazê-lo de acordo com a especificação do problema).

    
por 28.03.2015 / 10:29
7

com sed:

sed 's/@.*//; s/[-_.]/ /g; s/\<./\U&/g' <<END
[email protected]
[email protected]
[email protected]
END
User Name
User Name2
This Is A Very Long Email Id

Requer o GNU sed para a diretiva \U maiúsculas.

link

Expandido:

sed '
    s/@.*//        # remove @domain.name
    s/[-_.]/ /g    # translate dot,dash,underscore to spaces
    s/\<./\U&/g    # uppercase the first character of a word
                   # \< is a beginning-of-word marker
'

Um verso inescrutável do perl:

perl -nE's/@.*//;say"@{[map{ucfirst}/(\w+)/g]}"' 

Como o atalho de classe de caractere \w do perl inclui sublinhado,% [email protected] se torna This Is A Very Long_email Id

    
por 28.03.2015 / 12:43

Tags