我正在通过RegEx进行实验室研究,要求我:
在“国家”文件中搜索所有9个字符的单词,然后 字母i。
有多少个结果?
我正在在线仿真环境中的通用Linux命令提示符下工作。我被允许使用grep
,awk
或sed
,尽管我感到偏爱grep
。
(关于RegEx,我是100%的菜鸟,所以请向我解释一下,就像我5岁)
在以前的实验中,我已经使用了类似下面的方法,该方法可以找到具有9个字符的所有国家/地区,但是我无法找到一种方法来找到具有9个字符的所有单词,并且在任何位置都包含字母i
位置。
grep -E '\b\w{9}\b' countries
|
运算符无济于事,因为它是OR
运算符,它将为我找到所有找到的i
实例,以及所有9个字符的单词,并且我都需要同时出现同时。我也尝试了多个grep
语句,看来仿真器可能不接受。
我还试图坚持使用[]
字符集,因为下一个问题要求在9个字母的单词中包含多个字母。
答案 0 :(得分:1)
解决此问题的一种方法是两次使用grep
,然后将一个结果传送到下一个。
首先,我们找到所有长度为9的单词,就像您在上一个练习中所做的一样:
grep -Eo '\b\w{9}\b' countries
我使用的标志o
仅列出匹配的单词,每行打印一个单词。
接下来,我们使用Linux pipe(不是正则表达式OR)将第一个grep
的输出提供给第二个grep
:
grep -Eo '\b\w{9}\b' countries | grep 'i'
最终输出将是所有带有9个字符和i
的单词。
根据您的要求,如果您更专注于Regex,则可以将这种方法视为“作弊”,而如果您还学习Linux,则可以认为是一种很好的解决方案。
您正在寻找 words 的事实使正则表达式复杂化(与文件中的 lines 相反),但是也有可能提出一个正则表达式来匹配这些单词。
\b(?=\w*i)\w{9}\b
这基于您已经拥有的\b\w{9}\b
。 (?=\w*i)
是AND
条件。找到单词(\b
)的开头之后,我们以look ahead表示\w*i
(零个或多个字母,然后是i
)。我们在前瞻中使用\w*
,而不是.*
,因此我们正在查看相同的单词。 (?=.*i)
会与任何i
匹配,也在这9个字符之后。
找到i
之后,我们将继续确保单词只有9个字母。