澄清 grep 和正規表示式

澄清 grep 和正規表示式

長度為 10 個字元且包含三個連續元音的子字串的單字集。到目前為止我嘗試了這些命令。

grep -E '^.{10}$'| grep 'a*.e*.i*.o*.u*' words2.txt
grep -E '^.{10}$&a*.e*.i*.o*.u*' words2.txt

輸入數據,透過 OCR 提取這個截圖

unpernicious
unperspicuous
unpervious
unpious
unpiteous
unpiteously
unpiteousness
unplebeian
unplenteous
unportmanteaued
unportuous
unprecarious
unprecious
unprecocious
unpredacious
unpresumptuous
unpresumptuously
unpretentious
unpretentiously
unpretentiousness
unpromiscuous
unpropitious
unpropitiously
unpropitiousness
unpugnacious
unpunctilious
unquailed
unquailing
unquailingly
unqueen
unqueened
unqueening
unqueenlike
unqueenly
unquiescence
unquiescent
unquiescently
unquiet
unquietable
unquieted
unquieting
unquietly
unquietness
unquietude
unrapacious
unrebellious
unreligious
unreligiously
unreligiousness
unrighteous
unrighteously
unrighteousness
unsacrilegious
Unsagacious
unsalubrious
unsanctimonious
unsanctimoniously
unsanctimoniousness
unsanguineous
unsanguineously
unseditious
unseeable
unseeing

答案1

你的問題(恕我直言)可以更好地解決awk,但我只是指出你的命令的問題

grep -E '^.{10}$'| grep 'a*.e*.i*.o*.u*' words2.txt 

word2.txt要透過兩次調用過濾文件的內容grep,這應該看起來像

grep -E '^.{10}$' words2.txt | grep 'a*.e*.i*.o*.u*'

第二種grep模式應該是[auoie]{3},這使我們處於

grep -E '^.{10}$' words2.txt | grep -E '[aouie]{3}'

第一個的輸入grep是您的檔案。第二個的輸入grep是第一個的輸出grep不是你的文件。

使用 POSIX awk(如最新版本的 GNU awk):

$ awk 'length == 10 && /[aouei]{3}/' words2.txt
unpervious
unplebeian
unportuous
unprecious
unquailing
unqueening
unquieting
unquietude

mawk、BSDawk和歷史上的 POSIX 之前的實作在正規表示式中awk不支援{n}查澤拉斯 (Stéphane Chazelas) 指出

答案2

您猜對了 10 個字符,但要連續查找 3 個元音,請尋找一組[AEIOU]

egrep '^.{10}$' | egrep -i '[AEIOU]{3}'

若要拒絕空白,請使用以下指令:

egrep '^[^ \t]{10}$' | egrep -i '[AEIOu]{3}'

答案3

假設 1 個單字/行,您可以這樣做:

sed -nE '/^.{10}$/!d;/[aAeEiIoOuU]{3}/p' words.txt

答案4

內置grepPCRE 支援:

grep -iPx '(?=.*[aeiou]{3}.*).{10}'

或者:

grep -wiP '(?=\w*[aeiou]{3}\w*)\w{10}'

當這些單字不是每行一個時搜尋這些單字(-o如果您的grep實作支援僅列印匹配的單字而不是列印它們所在的整行,則會新增)。那裡單字表示任意序列單字字元(字母(在拉丁字母中,僅不帶變音符號,(*UCP)在任何字母中為字母添加一個,但仍然不包括像é或 之類的元音α)、數字和底線)。

相關內容