case insensitive string comparison in bash
下一行删除变量
1 | temp2=${content#$PRECEDING} |
但现在我想让
无需呼叫SED或使用Shott。最简单、最快捷的方法(只要您有bash 4):
1 2 3 | if ["${var1,,}" ="${var2,,}" ]; then echo"matched" fi |
您所要做的就是将字符串转换为小写并比较结果。
下面是一种使用SED的方法:
1 | temp2=$(sed -e"s/^.*$PRECEDING//I" <<<"$content") |
说明:
^.*$PRECEDING :^ 表示串的起始,. 表示任意字符,.* 表示任意字符零次或多次。因此,这意味着"匹配从字符串开始到随后(包括)存储在$PRECEDING 中的字符串的任何模式"。I 部分表示不区分大小写,g 部分(如果使用)表示"匹配所有事件",而不仅仅是第一个事件。<<< 表示法用于herestrings,因此您保存了一个echo 。
您的示例具有上下文切换技术。更好的是(bash v4):
1 2 3 4 5 6 | VAR1="HELLoWORLD" VAR2="hellOwOrld" if [["${VAR1^^}" ="${VAR2^^}" ]]; then echo MATCH fi |
链接:在bash中将字符串从大写转换为小写
我唯一能想到的bash方法是检查是否有匹配项(不区分大小写),如果是,从$content开头排除适当数量的字符:
1 2 3 4 5 | content=foo_bar_baz PRECEDING=FOO shopt -s nocasematch [[ $content == ${PRECEDING}* ]] && temp2=${content:${#PRECEDING}} echo $temp2 |
输出:
如果没有bash 4,我发现最简单的方法是首先使用
1 2 3 4 5 6 7 8 9 10 11 | 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更改为