BASHでEメールIDの最初の文字をすべて大文字に変換する

BASHでEメールIDの最初の文字をすべて大文字に変換する

スクリプトはEメールIDとフルネームを受け入れる必要があり、フルネームが指定されていない場合はEメールIDから名前を生成する必要があります。このような:

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

次のステップでこれを達成できました。

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[@]}"

BASHバージョン4.1.2を使用しています。

私はこれを達成するためのより良い方法があるべきだと思います。また、フィールド区切り文字がアンダースコア(_)やハイフン(-)などではないドット(.)文字であると仮定したため、問題が発生しました。もっと良い方法があれば教えてください。ありがとうございます。

答え1

実際、以下を使用すると、外部コマンドなしでBashでこれを完全に実行できます。噴射そしてパラメータ拡張。かなり短いです。

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

私は一行ずつ行きます:

USER=${EMAIL_ADDRESS%@*}

これにより、変数がUSER最後に一致しない部分に設定されます。つまり、ドメイン名を削除し、アドレスのユーザー部分のみを保持します。EMAIL_ADDRESS@*

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

これにより初期化が生成されます。大量に WORDS。初期値は次のように与えられる。コマンドの置き換え$(...)

次のコマンド置換が実行されます。サブシェルしたがって、メインシェルの値に影響を与えずに変数の値を安全に変更できます。これには以下が含まれますIFS噴射新しい単語の始まりにつながる文字のグループです。 、およびそれぞれは、必要に応じて新しい文字を追加できる単語の境界を形成します._-

変更後にIFS使用します。printf$USER分割された単語を印刷します。これは.より少し安全ですecho

echo "${WORDS[@]^}"

最後に結果を印刷してみましょう。ご存知のように、[@]配列拡張は^ 大文字の使用単語の最初の文字値(厳密に言えば、基本パターンの最初の出現?)です。

このスクリプトを実行した最終結果は次のとおりです。

This Is A Very Long Email Id

予想通り。


メールアドレスにシェルメタ文字などが含まれている場合は、*ワイルド?カード文字に展開されます。これを避けるために、WORDS=行をset -f/で囲むことができますが、set +f別のオプションがあります(コメントではGlenn Jackmanによって提供されます)。

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

これは以下を使用します。read -a単語分割の結果で配列を埋め、残り(圧縮された)は前のように残します。明示的な配列の初期化よりも読み取りがあまり明確ではありませんが、オプションです。

メールアドレスも可能だという点も注目に値する。厳密に言えば、形はいろいろあります、スペース、引用符、角かっこ文字を含むアドレスを含みます。これはまったく処理されません(質問の仕様によっては実際には処理できません)。

答え2

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

大文字の命令にはGNU sedが必要です\U

https://www.gnu.org/software/sed/manual/sed.html#The-_0022s_0022-command

拡張:

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
'

理解できないPerlライン:

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

Perlの\w文字クラスショートカットにはアンダースコアが含まれているので、
[email protected]これは次のようになります。
This Is A Very Long_email Id

関連情報