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

时间:2012-12-12 20:33:29

标签: bash string-comparison

以下行删除变量$PRECEDING

之前的前导文本
temp2=${content#$PRECEDING}

但现在我希望$PRECEDING不区分大小写。这适用于sed的{​​{1}}标记。但我无法弄清楚整个cmd。

5 个答案:

答案 0 :(得分:6)

无需打电话给sed或使用shopt。这是最简单快捷的方法(只要你有Bash 4):

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

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

答案 1 :(得分:4)

以下是使用

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

<强>解释

  • ^.*$PRECEDING^表示字符串的开头,.表示任何字符,.*表示任何字符为零次或多次。因此,这意味着“匹配从$PRECEDING中存储的字符串开头的字符串开始的任何模式。
  • I部分表示不区分大小写,g部分(如果您使用它)表示“匹配所有出现次数”而不仅仅是第1次。
  • <<<表示法是herestrings,因此您保存echo

答案 2 :(得分:1)

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

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

输出:_bar_baz

答案 3 :(得分:1)

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

VAR1="HELLoWORLD"
VAR2="hellOwOrld"

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

link:Converting string from uppercase to lowercase in Bash

答案 4 :(得分:0)

如果您没有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

通过将回声更改为OUTPUT="Match"&amp;,可以非常轻松地将输出分配给变量。 OUTPUT="Invalid"