在bash中以逗号分隔的列表匹配单词

时间:2019-06-12 07:44:47

标签: linux bash grep

我试图在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 个答案:

答案 0 :(得分:2)

在awk脚本中使用for循环来迭代逗号分隔的字段,并检查其中是否有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}'

这样,您就无需在中转义正则表达式有效的字符。

答案 1 :(得分:2)

您可以使用具有(,|^)foo(,|$)模式的Bash正则表达式匹配:

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

请参见online demo

正则表达式匹配

  • (,|^)-,或字符串的开头
  • foo-一些foo字符序列
  • (,|$)-,或字符串结尾。

答案 2 :(得分:0)

您可以用换行符替换逗号,然后使用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
相关问题