我正在通过一个关于正则表达式的实验室工作,它要求我:
在"国家"文件中搜索所有包含九个字符的单词,以及 字母 I.
找到多少结果?
我正在在线模拟环境中使用通用 Linux 命令提示符。我被允许使用grep
,awk
或sed
尽管我对grep
有偏好。
(在正则表达式方面,我是 100% 的菜鸟,所以请像我 5 岁一样向我解释)
根据之前的实验室,我已经使用了下面这样的东西,它可以找到所有有 9 个字符的国家/地区,但是我找不到一种方法来让它找到所有具有 9 个字符并在任何位置包含字母i
的单词。
grep -E 'bw{9}b' countries
|
运算符无济于事,因为它是一个OR
运算符,并且会找到我找到i
的所有实例,以及所有 9 个字符的单词,我需要同时发生两者。我也尝试了多个grep
语句,似乎模拟器可能不接受这一点。
我也试图坚持[]
字符集,因为下一个问题要求在 9 个字母的单词中有多个字母。
解决此问题的一种方法是使用grep
两次,并将一个结果传送到下一个结果。
首先,我们找到所有长度为 9 的单词,就像您在上一个练习中所做的那样:
grep -Eo 'bw{9}b' countries
我使用的是仅列出匹配单词的标志o
,每行打印一个单词。 接下来,我们使用 Linux 管道(不是正则表达式 OR)将第一个grep
的输出馈送到第二个grep
:
grep -Eo 'bw{9}b' countries | grep 'i'
最终输出将是所有单词,包含九个字符和i
。
根据您的要求,如果您更专注于正则表达式,这种方法可能会被视为"作弊",但如果您也在学习 Linux,这是一个很好的解决方案。
您正在寻找单词的事实使正则表达式复杂化(与文件中的行相反),但也有可能想出一个正则表达式来匹配这些单词。
b(?=w*i)w{9}b
这建立在您已有bw{9}b
的基础上。(?=w*i)
是AND
条件。在我们找到单词(b
)的开头后,我们向前看w*i
(零个或多个字母,然后是我们i
)。我们在展望中使用w*
,而不是.*
,所以我们在看同一个词。(?=.*i)
也会匹配九个字符之后的任何i
。
找到i
后,我们继续确保单词只有9个字母。
工作示例:https://regex101.com/r/G5EVdM/1