Bash-скриптинг, как удалить конечную подстроку, без учета регистра? - PullRequest
5 голосов
/ 02 декабря 2010

Я изменяю скрипт, который читает письмо пользователя.Это очень просто, слишком просто.

echo -n "Please enter your example.com email address: "
read email
email=${email%%@example.com} # removes trailing @example.com from email
echo "email is $email"

Это работает, но только для нижнего регистра @ example.com.Как я могу изменить это, чтобы удалить конечный @ example.com, без учета регистра?

Ответы [ 6 ]

5 голосов
/ 02 декабря 2010

Если у вас есть bash 4:

email=${email,,}
email=${email%%@example.com}

В противном случае, возможно, просто используйте tr:

email=$(echo "${email}" | tr "A-Z" "a-z")
email=${email%%@example.com}

Обновите :

Если выпросто хотите лишить хост (любой хост), тогда, возможно, это действительно то, что вы хотите:

email=${email%%@*}
3 голосов
/ 02 декабря 2010

Для Bash 3.2 и выше:

shopt -s nocasematch
email='JoHnDoE@eXaMpLe.CoM'
pattern='^(.*)@example.com$'
[[ $email =~ $pattern ]]
email=${BASH_REMATCH[1]}    # result: JoHnDoE
2 голосов
/ 08 апреля 2011

Вот еще один (хотя и немного длинный) пример:

email='JoHnDoE@eXaMpLe.CoM'
email=${email%%@[Ee][Xx][Aa][Mm][Pp][Ll][Ee].[Cc][Oo][Mm]}
echo "email is $email"
2 голосов
/ 02 декабря 2010

Как насчет использования sed?

email="$(sed 's|@example\.com$||i' <<<"$email")"

Обратите внимание на флаг 'i' в команде подстановки sed, которая запрашивает сопоставление без учета регистра.

0 голосов
/ 16 июля 2018

Использование без учета регистра совпадения с регулярным выражением:

echo -n "Please enter your example.com email address: "
read email
shopt -s nocasematch # Makes comparisons case insensitive
if [[ $email =~ example.com$ ]]; then
    domain=${BASH_REMATCH[0]}
    echo "email is ${email%%@$domain}"
fi

В качестве альтернативы вы можете обрезать строку на основе ее длины (что имеет смысл, только если вы знаете, что пользователь правильно вошел в домен):

echo -n "Please enter your example.com email address: "
read email
domain=example.com
email_length=${#email}
domain_length=${#domain}
name_length=$(($email_length-$domain_length-1))
email=${email:0:$name_length} # removes trailing @example.com from email
echo "email is $email"
0 голосов
/ 02 декабря 2010
echo -n "Please enter your example.com email address: "
read _email
_email=$(echo $_email | awk 'BEGIN{ FS="@" }  {print $1}')
echo $_email

, а для пересылки электронной почты в нижний регистр вы можете использовать команду Declare, например,

Declare -l email = $ email

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...