Соответствие слову в списке через запятую в bash - PullRequest
1 голос
/ 12 июня 2019

Я пытаюсь найти точное совпадение в скрипте 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" НЕ должно совпадать.Что происходит сейчас, это находит совпадение, но я не хочу этого.

Ответы [ 3 ]

2 голосов
/ 12 июня 2019

Вы можете использовать регулярные выражения Bash, соответствующие шаблону (,|^)foo(,|$):

haystack="foo 1,bar"
needle='(,|^)foo(,|$)'
if [[ "$haystack" =~ $needle ]]; then
    echo 'exists'
else
    echo 'does not exist'
fi

См. онлайн демо

регулярное выражение соответствует

  • (,|^) - либо ,, либо начало строки
  • foo - некоторая foo последовательность символов
  • (,|$) - , или конец строки.
2 голосов
/ 12 июня 2019

Используйте цикл 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}'

Таким образом, вам не нужно экранировать символы, активные в регулярных выраженияхв вашей игле .

0 голосов
/ 12 июня 2019

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