簡體   English   中英

如何使用shell變量使Grep減少貪婪感?

[英]How do I make Grep less Greedy with a shell variable?

我一直在完善我的grep技能,發現了一個特別的問題。 基本上是這樣的。 我有一個本地文件,里面有字典里的單詞。 用戶將輸入一個單詞,腳本將找到可以用該單詞中的字母組成的所有單詞。 問題是,單詞長度必須至少為4個字符,並且只能使用用戶輸入的任意數量的字母。因此,如果我輸入的單詞是“ College”,那么cell是可以接受的單詞,但不能接受像cocco這樣的單詞因為是的,它包含單詞中的字母,但是大學只有1 o和1 c。 到目前為止,這是我的正則表達式。

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

這將找到包含這些字母的字符串,這些字符串的長度至少為四個字符,但是grep貪婪,並且比變量中的字符更多。 如何指定僅使用變量中的字符數? 我已經堅持了幾天,但無濟於事。 感謝您的幫助和時間社區!

為了擴展@chepner在評論中所說的內容,正則表達式將不會測試范圍內的確切字符數。 換句話說, [ee]將不匹配2 e ,僅在完全存在e時才匹配,因此[ee][e]的冗余。 正則表達式通常匹配1個或多個匹配表達式[e]+ ,至少匹配1 e直到字符串的緩沖區大小。 要匹配特定數量的e ,您必須事先知道要執行[e]{2,5} ,該匹配至少2個但不超過5個e

即使您設置了預處理程序來計算輸入中重復的字母數,也很難匹配正則表達式。 以您的“大學”示例為例,預處理看起來像c = 1,o = 1,l = 2,e = 2,g = 1。 如果將它放在正則表達式中,例如^ c?o?l {0,2} e {0,2} g?$`[請注意“?” 在這種情況下,{0,1}]的簡寫甚至不會匹配“學院”,因為匹配將是定位的,它將匹配“ colleg”,“ colleeg”,“ colleg”等。

要驗證字符串的長度,您只需要驗證[]范圍內至少有字母即可。 您可能需要將其更改為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM