BASH에서 이메일 ID의 첫 번째 문자를 모두 대문자로 변환

BASH에서 이메일 ID의 첫 번째 문자를 모두 대문자로 변환

스크립트에서 이메일 ID와 전체 이름을 수락해야 하며, 전체 이름이 제공되지 않은 경우 이메일 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

관련 정보