bash中不区分大小写的字符串比较

case insensitive string comparison in bash

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

1
temp2=${content#$PRECEDING}

但现在我想让$PRECEDING不区分大小写。这与sedI标志一起工作。但我不知道整个命令。


无需呼叫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

输出:_bar_baz


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

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更改为OUTPUT="Match"OUTPUT="Invalid",很容易将输出分配给变量。