以下行删除变量之前的前导文本$PRECEDING
temp2=${content#$PRECEDING}
但现在我希望$PRECEDING
不区分大小写。这适用于sed
'I
标志。但我无法弄清楚整个cmd。
以下行删除变量之前的前导文本$PRECEDING
temp2=${content#$PRECEDING}
但现在我希望$PRECEDING
不区分大小写。这适用于sed
'I
标志。但我无法弄清楚整个cmd。
无需调用 sed 或使用 shopt。最简单快捷的方法(只要你有 Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo "matched"
fi
您所做的只是将两个字符串都转换为小写并比较结果。
这是使用sed的一种方法:
temp2=$(sed -e "s/^.*$PRECEDING//I" <<< "$content")
解释:
^.*$PRECEDING
:^
表示字符串的开头,.
表示任何字符,.*
表示任何字符零次或多次。因此,这意味着“匹配从字符串开头的任何模式,然后是(包括)存储在$PRECEDING
.I
部分表示不区分大小写,该g
部分(如果使用它)表示“匹配所有出现”,而不仅仅是第一个。<<<
表示法用于herestrings,因此您保存一个echo
.我能想到的唯一 bash 方法是检查是否存在匹配项(不区分大小写),如果是,则从 $content 的开头排除适当数量的字符:
content=foo_bar_baz
PRECEDING=FOO
shopt -s nocasematch
[[ $content == ${PRECEDING}* ]] && temp2=${content:${#PRECEDING}}
echo $temp2
输出:_bar_baz
您的示例具有上下文切换技术。更好的是(bash v4):
VAR1="HELLoWORLD"
VAR2="hellOwOrld"
if [[ "${VAR1^^}" = "${VAR2^^}" ]]; then
echo MATCH
fi
如果您没有 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"