需要有关 egrep 正则表达式的帮助

需要有关 egrep 正则表达式的帮助

我正在尝试创建一个 egrep 命令来从文本文件中 grep 包含特定文本的行数,但似乎某处有错误。

文本文件包含几千行,表达式占了Lastname好几行。问题是,其中还有一些我不想抓取的表达式,如xLastname或。因此,RegExpression 的定义应如下所示:abcLastname

出现之前的行中没有任何文本,Lastname或者该行中有文本,但随机文本和Lastname

我尝试使用((.+\ )?|(^.))Lastname和,((.+\ )?|[^.])Lastname但 egrep 命令总是找到类似这样的表达式abcLastname

我的错误在哪里?第一部分(.+\ )(“如果有文本,则后面必须有一个空格”)似乎可以正常工作,但第二部分(“或者根本没有文本”)似乎不起作用。

有没有一个特殊字符可以用来简单地检查它后面的内容是否是行中的第一个表达式/字符?不幸的是,我在网上找不到这些信息。

提前感谢大家的帮助

答案1

首先,你不需要转义空格,也不需要在 OR 表达式中放置括号。因此来自的正则表达式你的评论简化为(.+ | |^)Lastname

现在,空间是重要的部分,因此它进一步简化为( |^)Lastname,实际上相当于\bLastname,其中\b词边界

为了防止出现类似 的匹配LastnameABC,请在末尾添加另一个单词边界:\bLastname\b。或者您可以使用 grep 选项-w,它仅匹配整个单词。它们是等效的:

grep -E '\bLastname\b'
grep -w Lastname

归功于钢铁司机PerlDuck在评论中提出这些建议

您的问题中的正则表达式的主要问题是,(.+ )?由于问号,第一组是可选的。因此((.+ )?|^.)简化为(|^.)。现在因为 OR 的第一部分为空,所以整个内容实际上为空。因此(|^.)Lastname简化为Lastname

相关内容