Проверьте, соответствует ли переменная списку подстрок - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь написать скрипт, который фильтрует определенные слова.

Это метод, который я использовал.это работало хорошо, но когда количество возможных совпадений стало слишком большим, оно больше не справлялось с работой.Я не уверен, есть ли у этого метода какие-то ограничения.Так что любые альтернативы приветствуются.

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

Ответы [ 3 ]

0 голосов
/ 27 декабря 2018

Или вы можете просто использовать следующий оператор сопоставления регулярных выражений =~, который сравнивает строку слева с расширенным регулярным выражением справа

str="He is driving a car"
vehicules="car|bus|truck|vehicle"

if [[ $str =~ $vehicules ]]; then
  echo "Substring found"
fi

Решение, использующее expr match, также может бытьб.

0 голосов
/ 29 декабря 2018

Это хорошо сработало для меня

case ${str} in car* | bus* | truck* | vehicle*)
    echo "Substring found"
esac
0 голосов
/ 27 декабря 2018

Я не думаю, что с вашим методом что-то не так, хотя я бы сказал, что писать его довольно долго.

Поскольку вы используете bash, вы можете использовать расширенный глоб, который уменьшаетдлина вашего кода значительно:

# 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...