【问题标题】:case insensitive string comparison in bashbash中不区分大小写的字符串比较
【发布时间】:2012-11-30 15:35:23
【问题描述】:

以下行删除变量$PRECEDING之前的前导文本

temp2=${content#$PRECEDING}

但现在我希望 $PRECEDING 不区分大小写。这适用于sedI 标志。但我无法弄清楚整个cmd。

【问题讨论】:

标签: bash string-comparison


【解决方案1】:

无需调用 sed 或使用 shopt。最简单快捷的方法(只要你有 Bash 4):

if [ "${var1,,}" = "${var2,,}" ]; then
  echo "matched"
fi

您所做的只是将两个字符串都转换为小写并比较结果。

【讨论】:

    【解决方案2】:

    这是使用 的一种方法:

    temp2=$(sed -e "s/^.*$PRECEDING//I" <<< "$content")
    

    说明:

    • ^.*$PRECEDING^ 表示字符串的开头,. 表示任何字符,.* 表示任何字符零次或多次。因此,这意味着“匹配从字符串开头开始的任何模式,然后是(包括)存储在$PRECEDING 中的字符串。
    • I 部分表示不区分大小写,g 部分(如果使用它)表示“匹配所有匹配项”,而不仅仅是第一个。
    • &lt;&lt;&lt; 表示法用于 herestrings,因此您可以保存 echo

    【讨论】:

    • 这只会删除 $PRECEDING 变量。与 gI 它也是不区分大小写的!但是如何同时删除 $PRECEDING 变量之前的前导文本?
    • @user1898411 查看更新后的答案:(^.*$PRECEDING 而不是$PRECEDING
    【解决方案3】:

    我能想到的唯一 bash 方法是检查是否存在匹配项(不区分大小写),如果是,则从 $content 的开头排除适当的字符数

    content=foo_bar_baz
    PRECEDING=FOO
    shopt -s nocasematch
    [[ $content == ${PRECEDING}* ]] && temp2=${content:${#PRECEDING}}
    echo $temp2
    

    输出:_bar_baz

    【讨论】:

      【解决方案4】:

      您的示例具有上下文切换技术。 更好的是(bash v4):

      VAR1="HELLoWORLD"
      VAR2="hellOwOrld"
      
      if [[ "${VAR1^^}" = "${VAR2^^}" ]]; then
          echo MATCH
      fi
      

      链接:Converting string from uppercase to lowercase in Bash

      【讨论】:

        【解决方案5】:

        如果您没有 Bash 4,我发现最简单的方法是首先使用 tr 将字符串转换为小写

        VAR1=HelloWorld
        VAR2=helloworld
        
        VAR1_LOWER=$(echo "$VAR1" | tr '[:upper:]' '[:lower:]')
        VAR2_LOWER=$(echo "$VAR2" | tr '[:upper:]' '[:lower:]')
        
        if [ "$VAR1_LOWER" = "$VAR2_LOWER" ]; then
          echo "Match"
        else
          echo "Invalid"
        fi
        

        通过将 echo 更改为 OUTPUT="Match"OUTPUT="Invalid",这也使得将输出分配给变量变得非常容易

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-27
          • 2013-03-11
          • 2021-05-09
          • 2015-07-23
          • 1970-01-01
          相关资源
          最近更新 更多