使用Regex和linux命令(grep或egrep?)来查找特定的字符串

时间:2015-03-20 19:09:43

标签: regex linux grep

注意:我不确定我的正则表达式是否正确,因为我在学校的教科书没有解释/教授这种形式的正则表达式,只有数学表格如DFA / NFA

我将不胜感激任何建议或提示

问题:

(a)在文本中发现所有出现的三个字母单词,以“a”开头,以“e”结尾;

(b)查找文本中以“m”开头并以“r”结尾的所有单词;

我的方法:

a)^[a][a-zA-Z][e]$(如何区分3个字母的单词和所有单词?)

b)^[m][a-zA-Z][r]$

此外,我想在linux中使用这些正则表达式,那么以下命令是否有效?:

grep '^[a][a-zA-Z][e]$' 'usr/dir/.../text.txt'

或者我应该以这种方式使用egrep:

find . -text "*.txt" -print0 | xargs -0 egrep '^[a][a-zA-Z][e]$'

4 个答案:

答案 0 :(得分:4)

您可以使用grep -w替换两个匹配的正则表达式:

grep -w 'a[a-zA-Z]e\|m[a-zA-Z]*r' file.txt

答案 1 :(得分:1)

您可以使用单词边界\b来匹配单词的开头和结尾:

a)在文本中找到所有出现的以“a”开头且以“e”结尾的三个字母单词;

grep -o '\ba[a-zA-Z]e\b'

模式匹配单词边界,然后是跟随a,单个字符和后续e以及单词边界。

b)查找文本中以“m”开头并以“r”结尾的所有单词;

grep -o '\bm[a-zA-Z]*r\b'

模式匹配单词边界,m零个以上的字符(通过*量词),r和单词边界。


此外,我正在使用选项-o,它在自己的行上输出每个匹配,而不是输出包含匹配的整行输入。


顺便说一句,感谢选项-w - 只匹配整个单词 - 您甚至可以将上述模式简化为:

A)

grep -wo 'a[a-zA-Z]e'

和b)

grep -wo 'm[a-zA-Z]*r'

感谢@anubhava!


您要求egrepegrep无法帮助简化或优化模式。 grep绝对没问题。

答案 2 :(得分:0)

首先,egrep已延长grep,与使用选项grep调用-E相同。其次,在许多情况下,您不需要使用findxargs因为-r选项将在指定路径中的文件中递归搜索。

您的正则表达式适合grep支持的基本(非扩展)正则表达式语言,因此不需要egrep

我会将其简化为

grep -r '^a[a-zA-Z]e$' /usr/share/dict/

和这个

grep -r '^m[a-zA-Z]*r$' /usr/share/dict/

答案 3 :(得分:0)

在你的例子中,你只会匹配与三个字符匹配的整行,与你期望的字母相匹配。

'^'表示行的开头

'$'表示该行的结尾

为了只抽出三个字母的单词,你必须在一些空格上匹配。例如 grep'a [a-Z] e''usr / dir /.../ text.txt'

然而,这将错过行开头或结尾处的三个字母单词的所有实例

here is an issue using egrep and grep to match whitespace/start of line