Преобразование всех первых символов в идентификатор электронной почты в верхний регистр в BASH

Мне нужно принять идентификатор электронной почты и полное имя в скрипте, и в случае, если полное имя не указано, мне нужно сгенерировать имя из идентификатора электронной почты. Что-то вроде этого:

Case 1: EmailID: user.name@domainname.com Full Name: User Name Case 2: EmailID: user.name2@domainname.com Full Name: User Name2 Case 3: EmailID: this.is.a.very.long.email.id@domainname.com 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

Я думаю, что должен быть лучший способ добиться этого. Кроме того, я уже вижу проблему в этом, так как я предполагаю, что разделитель полей будет точечным (.) Символом, а не чем-то еще, как подчеркивание (_) или дефис (-) или что-нибудь еще. Если есть лучший способ сделать это, пожалуйста, дайте мне знать. Благодарю.

2 Solutions collect form web for “Преобразование всех первых символов в идентификатор электронной почты в верхний регистр в BASH”

Вы можете сделать это полностью в Bash без каких-либо внешних команд, используя разбиение слов и расширение параметров . Это даже довольно коротко:

 EMAIL_ADDRESS=this.is.a.very-long_email.id@domainname.com 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 для заполнения массива результатами разделения слов, а остальное (сжатое), как и раньше. Я считаю это менее понятным для чтения, чем явная инициализация массива, но это вариант.

Стоит также отметить, что адреса электронной почты могут содержать строго разные формы , в том числе с пробелами, кавычками и символами скобок, и это вообще не касается этих адресов (и это действительно невозможно сделать ваша спецификация проблемы).

С sed:

 sed 's/@.*//; s/[-_.]/ /g; s/\<./\U&/g' <<END user.name@domainname.com user.name2@domainname.com this.is.a.very.long.email.id@domainname.com 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

Expanded:

 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]}"' 

Поскольку ярлык класса символа \w символа perl включает символ подчеркивания,
this.is.a.very-long_email.id@domainname.com становится
This Is A Very Long_email Id

  • Как сгенерировать текстовые файлы, начиная с родительского текстового файла
  • Почему BASH печатал «bash: cd: write error: Success»?
  • Сценарий оболочки не может создать файл awk
  • Как я должен понимать «.» В расширении имени файла?
  • приостановка сценария bash до тех пор, пока не будут выполнены предыдущие команды
  • Параметры Bash и интерактивные оболочки
  • bash заменить массив с именем var с другим массивом
  • Удаление файла с непечатаемыми символами
  • изменить скрипт bash во время его запуска
  • Оператор Bash OR не оценивает несколько переменных
  • Перенаправить stdout и stderr, с метками времени только на stderr
  • Interesting Posts

    Как запустить сценарий оболочки из любого места

    Как запустить приложение gui framebuffer (no X) при запуске вместо приглашения на вход в консоль?

    Автоматические настройки громкости?

    сценарий просмотра pdf-кода

    Попытки унифицировать Linux и другие бесплатные Unix?

    Настройка ssh для сеанса linux to solaris

    Не удается загрузить окна после установки ubuntu

    Определите тип интерфейса / режим мониторинга с помощью «/ sys / class / net»

    Математические операции с входными данными и печатью?

    mdadm: ПРОГРАММА всегда запускается пользователем root?

    почему репозиторий debian не содержит lokkit?

    Как определить определенный системный вызов, вызванный или нет, во всем рабочем процессе?

    Как получить доступ к моему веб-серверу Mageia VirtualBox из моего веб-браузера главной системы?

    Как отключить модуль гибких дисков от загрузки при загрузке в CentOs7?

    вывод вершины усекает до 80 столбцов при запуске cron

    Linux и Unix - лучшая ОС в мире.