Сравнение строк без учета регистра в сценарии оболочки
165578 просмотра
11 ответа
==
Оператор используется для сравнения двух строк в скрипте оболочки. Тем не менее, я хочу сравнить две строки без учета регистра, как это можно сделать? Есть ли стандартная команда для этого?
Ответы (11)
65 плюса
если у вас есть Баш
str1="MATCH"
str2="match"
shopt -s nocasematch
case "$str1" in
$str2 ) echo "match";;
*) echo "no match";;
esac
в противном случае вы должны сообщить нам, какую оболочку вы используете.
альтернатива, используя awk
str1="MATCH"
str2="match"
awk -vs1="$str1" -vs2="$str2" 'BEGIN {
if ( tolower(s1) == tolower(s2) ){
print "match"
}
}'
Автор: ghostdog74
Размещён: 13.11.2009 12:02
135 плюса
В Bash вы можете использовать раскрытие параметров, чтобы изменить строку для всех строчных и прописных букв:
var1=TesT
var2=tEst
echo ${var1,,} ${var2,,}
echo ${var1^^} ${var2^^}
Автор: alphaniner
Размещён: 16.10.2013 07:20
99 плюса
Все эти ответы игнорируют самый простой и быстрый способ сделать это (если у вас есть Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo ":)"
fi
Все, что вы делаете - конвертируете обе строки в строчные и сравниваете результаты.
Автор: Riot Размещён: 28.12.2014 07:1333 плюса
То же, что и ответ от ghostdog74, но немного другой код
shopt -s nocasematch
[[ "foo" == "Foo" ]] && echo "match" || echo "notmatch"
shopt -u nocasematch
Автор: Gerry Hickman
Размещён: 03.01.2013 11:45
13 плюса
Один из способов - преобразовать обе строки в верхнюю или нижнюю:
test $(echo "string" | /bin/tr '[:upper:]' '[:lower:]') = $(echo "String" | /bin/tr '[:upper:]' '[:lower:]') && echo same || echo different
Другим способом было бы использовать grep:
echo "string" | grep -qi '^String$' && echo same || echo different
Автор: Randy Proctor
Размещён: 13.11.2009 11:52
7 плюса
Для оболочки korn я использую встроенную команду typeset (-l для строчных букв и -u для прописных).
var=True
typeset -l var
if [[ $var == "true" ]]; then
print "match"
fi
Автор: Ek C.
Размещён: 26.09.2013 10:17
5 плюса
Очень просто, если вы воспользуетесь fgrep, чтобы сделать строку без учета регистра:
str1="MATCH"
str2="match"
if [[ $(fgrep -ix $str1 <<< $str2) ]]; then
echo "case-insensitive match";
fi
Автор: Cooper F. Nelson
Размещён: 31.05.2016 06:46
3 плюса
Вот мое решение с использованием tr:
var1=match
var2=MATCH
var1=`echo $var1 | tr '[A-Z]' '[a-z]'`
var2=`echo $var2 | tr '[A-Z]' '[a-z]'`
if [ "$var1" = "$var2" ] ; then
echo "MATCH"
fi
Автор: stones333
Размещён: 09.05.2016 07:01
3 плюса
grep
имеет -i
флаг, который означает, что регистр не учитывается, поэтому попросите его сообщить вам, находится ли var2 в var1.
var1=match
var2=MATCH
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
echo "MATCH"
fi
Автор: Larry
Размещён: 27.04.2010 08:00
1 плюс
1 плюс
Для zsh
синтаксиса немного отличается:
> str1='MATCH'
> str2='match'
> [ "$str1" == "$str2:u" ] && echo 'Match!'
Match!
>
Это преобразуется str2
в верхний регистр перед сравнением.
Больше примеров для изменения регистра ниже:
> xx=Test
> echo $xx:u
TEST
> echo $xx:l
test
Автор: smac89
Размещён: 18.07.2018 12:31
Вопросы из категории :
- string В чем разница между строкой и строкой в ??C #?
- string Почему в Ruby нет реального StringBuffer или StringIO?
- string Преобразовать строку в перечисление в C #
- string Преобразование списка <Integer> в список <String>
- string Самый эффективный способ объединения строк?
- shell Вызов команд оболочки из Ruby
- shell Как разрешить символические ссылки в сценарии оболочки
- shell Проверьте, существует ли каталог в сценарии оболочки
- shell Как я могу отправить стандартный вывод одного процесса нескольким процессам, используя (желательно безымянные) каналы в Unix (или Windows)?
- shell Как подавить прекращение сообщения после убийства в bash?
- compare Как бы вы сравнили два XML-документа?
- compare Сравните две даты с JavaScript
- compare Как сравнить только дату, а не время двух дат?
- compare Javascript String Compare == иногда не удается
- compare Mysql Сравнить два поля даты и времени
- case-insensitive Как вы делаете нечувствительный к регистру поиск с использованием модификатора шаблона, используя меньше?
- case-insensitive Поиск без учета регистра
- case-insensitive Как мне сделать сравнение строк без учета регистра?
- case-insensitive Без учета регистра 'Содержит (строка)'
- case-insensitive Нечувствительное к регистру регулярное выражение без re.compile?