我一直在使用发现的特定问题来抛光我的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