Нечувствительное к регистру сравнение строк в сценарии оболочки

Мне нравится понятие белого списка Eugene. Я должен был сделать подобную вещь как исходный плакат, но я должен был поддерживать все символы Unicode, не только до 0x00FD. Спецификация XML:

Символ = #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]

В.NET, внутреннее представление символов Unicode составляет только 16 битов, таким образом, мы не можем 'позволить' 0x10000-0x10FFFF явно. Спецификация XML явно запрещает суррогатные кодовые точки, начинающие в 0xD800 с появления. Однако возможно, что, если мы позволили эти суррогатные кодовые точки в нашем белом списке, utf-8 кодирование нашей строки, мог бы произвести допустимый XML в конце, пока надлежащее кодирование utf-8 было произведено из суррогатных пар utf-16 символов в строке.NET. Я не исследовал это, хотя, таким образом, я пошел с более безопасной ставкой и не позволил суррогаты в своем белом списке.

комментарии в решении Eugene вводят в заблуждение, хотя, проблема состоит в том, что символы, которые мы исключаем, не допустимы в XML... они - совершенно допустимые кодовые точки Unicode. Мы не удаляем 'non-utf-8 символы. Мы удаляем utf-8 символы, которые не могут появиться в правильно построенных XML-документах.

public static string XmlCharacterWhitelist( string in_string ) {
    if( in_string == null ) return null;

    StringBuilder sbOutput = new StringBuilder();
    char ch;

    for( int i = 0; i < in_string.Length; i++ ) {
        ch = in_string[i];
        if( ( ch >= 0x0020 && ch <= 0xD7FF ) || 
            ( ch >= 0xE000 && ch <= 0xFFFD ) ||
            ch == 0x0009 ||
            ch == 0x000A || 
            ch == 0x000D ) {
            sbOutput.Append( ch );
        }
    }
    return sbOutput.ToString();
}
116
задан Benjamin W. 17 June 2016 в 13:40
поделиться

4 ответа

, если у вас есть bash

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"
  }
}'
65
ответ дан 24 November 2019 в 02:11
поделиться

Один из способов - преобразовать обе строки в верхнюю или нижнюю:

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
13
ответ дан 24 November 2019 в 02:11
поделиться

shopt -s nocaseglob

1
ответ дан 24 November 2019 в 02:11
поделиться

grep имеет флаг -i , что означает нечувствительность к регистру, поэтому попросите его сообщить вам, находится ли var2 в var1.

var1=match 
var2=MATCH 
if echo $var1 | grep -i "^${var2}$" > /dev/null ; then
    echo "MATCH"
fi
2
ответ дан 24 November 2019 в 02:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: