我试图在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”不得匹配。现在发生了什么,它找到了一个匹配项,但我不想要那个。
答案 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