以下行删除变量$PRECEDING
temp2=${content#$PRECEDING}
但现在我希望$PRECEDING
不区分大小写。这适用于sed
的{{1}}标记。但我无法弄清楚整个cmd。
答案 0 :(得分:6)
无需打电话给sed或使用shopt。这是最简单快捷的方法(只要你有Bash 4):
if [ "${var1,,}" = "${var2,,}" ]; then
echo "matched"
fi
你所做的就是将两个字符串转换为小写并比较结果。
答案 1 :(得分:4)
以下是使用sed:
的方法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
答案 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"