【发布时间】:2012-11-30 15:35:23
【问题描述】:
以下行删除变量$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。【讨论】:
^.*$PRECEDING 而不是$PRECEDING)
我能想到的唯一 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
通过将 echo 更改为 OUTPUT="Match" 和 OUTPUT="Invalid",这也使得将输出分配给变量变得非常容易
【讨论】: