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