检查单词(值)是否在逗号分隔的列表中

检查单词(值)是否在逗号分隔的列表中

在下面的代码中,2不应与 匹配21,但它给出的结果是“匹配”。

如何检查该SOURCE值是否在 中LIST

LIST="1,21,3,4"
SOURCE="2"
if echo "$LIST" | grep -q "$SOURCE"; then
  echo "matched";
else
  echo "no match";
fi

答案1

标准技巧是

if echo ",$LIST," | grep -q ",$SOURCE,"
then
  echo "matched"
else
  echo "no match"
fi

(或者你可以说grep -q ",$SOURCE," <<< ",$LIST,")。搜索2将匹配21,但搜索,2,将不匹配,21,$LIST 如果$SOURCE我们要查找的数字是第一个或最后一个数字,则需要在开头和结尾添加逗号;例如,

grep -q ",1," <<< "1,21,3,4"

将失败。

答案2

您对“word”的使用(对我来说)是建议您可以使用 grep 的单词边界结构:

LIST="1,21,3,4"
SOURCE="2"
if echo "$LIST" | grep -q "\\<$SOURCE\\>"; then
  echo "matched";
else
  echo "no match";
fi

答案3

使用awk

list="1,21,3,4"
source=2

awk -F, -v search="$source" '{ for (i=1;i<=NF;i++) { if ($i==search) {print $i} } }' <<<"$list"

2您正在整个字符串中搜索,并且21实际上包含2.

如果您的整个字符串始终以逗号分隔,您也可以这样做:

grep -E ',2,|,2$|^2,'

2这将在列表的开头、中间或结尾找到 a 。

相关内容