我正在尝试编写一个过滤某些单词的脚本。
这是我使用的方法。它运行良好,但是当可能的比赛数量变得太大时,它就不再起作用了。我不确定此方法是否有某种限制。因此,欢迎有其他选择。
str="He is driving a car"
if [ "$str" != "${str/car/}" ] || [ "$str" != "${str/bus/}" ] || [ "$str" != "${str/truck/}" ] || [ "$str" != "${str/vehicle/}" ];then
echo "Substring found"
else
echo "Substring not found"
fi
答案 0 :(得分:3)
我认为您的方法没有任何问题,尽管我会说编写时间很长。
由于您使用的是bash,因此可以使用扩展的glob,这可以大大减少代码的长度:
# enable extended globs
shopt -s extglob
# match anything containing car, bus, truck or vehicle
if [[ $str = *@(car|bus|truck|vehicle)* ]]; then
echo "Substring found"
fi
# unset extended glob mode
shopt -u extglob
答案 1 :(得分:1)
或者您可以简单地使用以下正则表达式匹配运算符=~
,将左边的字符串与右边的扩展正则表达式进行比较
str="He is driving a car"
vehicules="car|bus|truck|vehicle"
if [[ $str =~ $vehicules ]]; then
echo "Substring found"
fi
也可以使用使用expr match
的解决方案。
答案 2 :(得分:0)
这对我来说很好
case ${str} in car* | bus* | truck* | vehicle*)
echo "Substring found"
esac