스크립트에서 이메일 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