5

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

temp2=${content#$PRECEDING}

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

4

5 回答 5

7

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

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

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

于 2015-08-25T17:43:51.087 回答
4

这是使用的一种方法:

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

解释:

  • ^.*$PRECEDING:^表示字符串的开头,.表示任何字符,.*表示任何字符零次或多次。因此,这意味着“匹配从字符串开头的任何模式,然后是(包括)存储在$PRECEDING.
  • I部分表示不区分大小写,该g部分(如果使用它)表示“匹配所有出现”,而不仅仅是第一个。
  • <<<表示法用于herestrings,因此您保存一个echo.
于 2012-12-12T20:38:28.910 回答
1

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

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

输出:_bar_baz

于 2012-12-12T21:40:34.887 回答
1

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

VAR1="HELLoWORLD"
VAR2="hellOwOrld"

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

链接:在 Bash 中将字符串从大写转换为小写

于 2017-10-30T08:03:00.797 回答
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"这也使得通过将 echo 更改为&来将输出分配给变量变得非常容易OUTPUT="Invalid"

于 2017-05-30T21:24:03.643 回答