[英]Match multiple characters one or more times
考慮以下問題:我們有一個從/ dev / urandom流出的隨機字符字符串,並且我們想要以一種滿足某些條件的恆定長度的字符串的方式對其進行處理。 例如,如果我們運行以下命令5次,則會得到:
cat /dev/urandom |tr -dc A-Z5|head -c${1:-30}
DLZEZDATSTDN55BNVDSNRFSLRKHDGR
AVCRIE5OAFBUWZZYQYQWCTAZSNMQAA
HSTFN5AQNWILXMSZCBIGREPNCFGPDM
AZJNEUQRCDYSKXMQDUHVTOFEOAYPHF
ANFDWHHZHLAGXCPKWLQESSZLEZYNDC
現在,這些字符串滿足了我所需的條件,但僅滿足部分條件。 對於前。 我需要數字5在字符串中出現至少2次但不超過7次,並且任何字母都不應出現超過10次。 我應該如何自定義上面的命令以獲得此結果?
使用GNU awk
處理:
awk -v FS="" '{
err=0;
for(i=1; i<=NF; i++) {
a[$i]++;
if ($i~/[A-Z]/ && a[$i]>10) { err=1; break }
}
if (!err && (2>a[5] || a[5]>7)) err=1
}
END{ if (!err) print }' <(cat /dev/urandom | tr -dc A-Z5 | head -c30)
FS=""
-在這種情況下,記錄中的每個字符都變成一個單獨的字段 僅當滿足所有條件時,以上內容才會使隨機字符串打印。
使用帶有OP所需過濾器的函數的Bash解決方案。
filter是字符5出現的計數。 我通過用tr除去字符串中除字符5之外的所有內容,然后計算還剩下多少個字符來實現這一點。
grep -E'(。)(。 \\ 1){10}'*是一個標准的正則表達式,可確保沒有出現超過10次的字符。
然后,循環僅獲得一個隨機的單詞,緊接着另一個單詞,直到滿足所有三個條件。 當然,這可能需要隨機的時間。 :P
function GETRANDOMWORD {
local filter=0;
until [[ $filter -gt 1 && $filter -lt 8 && ! $( echo "$word" | grep -E '(.)(.*\1){10}') ]]
do
word="$( cat /dev/urandom |tr -dc A-Z5|head -c${1:-30} )"
filter=$( echo "$word" | tr -cd '5' | wc -c )
done
[[ "$word" ]] && echo "$word"
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.