Я пытаюсь найти точное совпадение в сценарии bash в списке слов, разделенных запятыми.
Я пытался использовать grep с различными флагами, например, grep -w, но это не работает.
У меня есть это:
haystack = "foo 1,bar"
needle = "foo"
if [[ $( echo $haystack | grep $needle ) ]]; then
echo exists
else
echo does not exist
fi
В приведенном выше примере "foo 1" НЕ ДОЛЖЕН совпадать. Что происходит сейчас, это находит совпадение, но я не хочу этого.





Используйте цикл for в скрипте awk, чтобы перебирать поля, разделенные запятыми, и проверять, есть ли среди них foo.
haystack='foo 1,bar'
needle='foo'
echo "$haystack" | awk -F',' -v needle = "$needle" '{for(i=1;i<=NF;++i){if ($i==needle){print "exists";exit 0}}} END{print "doesn\047t exist";exit 1}'
Таким образом, вам не нужно экранировать символы, активные в регулярных выражениях, в вашем иголка.
Вы можете использовать сопоставление регулярных выражений Bash с шаблоном (,|^)foo(,|$):
haystack = "foo 1,bar"
needle='(,|^)foo(,|$)'
if [[ "$haystack" =~ $needle ]]; then
echo 'exists'
else
echo 'does not exist'
fi
См. онлайн демо
Регулярное выражение соответствует
(,|^) - либо ,, либо начало строкиfoo - некоторая последовательность символов foo(,|$) - , или конец строки.Вы можете заменить запятую на новую строку, а затем использовать grep -x (точное совпадение):
haystack = "foo 1,bar"
needle = "foo"
grep -qFx "$needle" <<< "${haystack//,/$'\n'}" && echo "exists" || echo "does not exist"
does not exist
needle = "foo 1"
grep -qFx "$needle" <<< "${haystack//,/$'\n'}" && echo "exists" || echo "does not exist"
exists