将字符串与数组中的所有元素进行比较?

时间:2017-03-11 00:57:17

标签: arrays bash grep

我知道可能有一种方法可以做到这一点但是大多数方法都是与我想要完成的方式相反的方式。我想比较数组中的元素(来自"单词"程序的英语字典单词),并查看它们是否包含在字符串中的任何位置。例如,如果我键入123hello456,它将扫描我的字符串对阵数组并在该字符串中找到hello,即使它被数字包围。

read -p "enter test string: " string
array=(`cat /usr/share/dict/words`)
if [[ "${array[*]}" == *"$string"* ]]; then
echo "there is a dictionary word in your string"
else
echo "no dictionary words contained within your string"
fi

2 个答案:

答案 0 :(得分:1)

您可以使用printfgrep

if printf '%s\n' "${array[@]}" | grep -qFx -- "$string"; then
  : match found
fi
  • -F将内容与字符串匹配,而非模式
  • -x匹配整行以防止因部分匹配而产生的误报
  • -q抑制输出
  • --可防止由-
  • 中的前导$string引起的问题

答案 1 :(得分:0)

一个简单的选择是使用grep,它允许您指定要匹配的多个模式,并使用固定字符串(而不是正则表达式)来避免这种开销。

$ grep -F -f /usr/share/dict/words <<<'123hello456'
123hello456

这实际上匹配“ello”,因为它在我的words文件中较早出现,但它也匹配“你好”。

您可以使用-q标记来抑制grep的输出,因此您的脚本将变为:

read -p "enter test string: " string
if grep -q -F -f /usr/share/dict/words <<<"$string"; then
  echo "there is a dictionary word in your string"
else
  echo "no dictionary words contained within your string"
fi

请注意,如果您经常调用此方法,则效率并不高,因为grep每次都必须重新加载整个words文件。根据你想要完成的其他事情,我绝对会考虑将这种语言交换为Python等“真实”语言。