如何使用壳变量使Grep减少贪婪



我一直在使用发现的特定问题来抛光我的GREP技能。基本上是这样的。我有一个本地文件,其中包含字典中的单词。用户将传递一个单词,脚本将找到所有可以用该单词字母制成的单词。捕获是,这些单词必须至少长4个字符,您只能使用用户传递的任务。因为是的,它包含单词的字母,但大学只有1 o和1 c。这是我到目前为止的正则表达。

egrep -i "^[("$text")]{4,}$" /usr/dict/words   

这将发现包含至少四个字符的字符串,但是Grep比变量中的字符更加贪婪,并且抓住了更多的字符。我将如何指定仅使用变量中的字符数量?我已经被困了几天了,无济于事。感谢您的帮助和时间社区!

为了扩展@chepner在评论中所说的话,正则表达式不会测试范围内的确切字符数。换句话说,[ee]将不匹配2 e的s,只有在有E完全匹配的情况下,[ee][e]的冗余。正则表达式通常匹配匹配表达式[e]+的1个或更多匹配,至少将1 e与字符串的缓冲区大小匹配。要匹配特定数量的 e s,您必须知道,在执行诸如[e]{2,5}之类的事情之前,它至少匹配2个但不超过5 e

即使您设置了一个预处理器来计算输入中重复的字母数量,您也很难与正则表达式匹配您的认为如何匹配。为了按照您的"大学"示例,预处理看起来像是c = 1,o = 1,l = 2,e = 2,g = 1。如果您将其放在正则表达式中,例如您有 ^c?在这种情况下,对于{0,1}}的短距

要验证字符串的长度,您只验证至少在 []范围内的字母。您可能需要将其更改为grep "^.{4,}$",以检查整个长度至少4个字符。

如果您不仅限于使用GREP,但仅限于Bash,则可以使用以下脚本来解决您的问题:

read input
cat /usr/dictwords | while read line
do
  if $(echo $line | grep "^.{4,}$" >> /dev/null)
  then
    testVal=$line
    for i in $(echo $input | sed -e 's/(.)/1 /g')
      testVal=$(echo "$testVal" | sed -e "s/$i/_/i")
    done
  fi
  if $(echo $testVal | grep "^_+$" >> /dev/null)
  then
    echo $line
  fi
done

相关内容

  • 没有找到相关文章

最新更新