澄清 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)在任何文字中为字母添加 a,但仍不包括像é或 之类的元音α)、数字和下划线)。

相关内容