使用星号标记在grep中

18 浏览
0 Comments

使用星号标记在grep中

我正在尝试在Linux/bash中的特定文件中搜索子字符串"abc"。

所以我执行以下操作:

grep '*abc*' myFile

但是它没有返回任何结果。

但是如果我执行以下操作:

grep 'abc' myFile

它会正确返回匹配结果。

现在,对我来说这不是一个问题。但是如果我想要grep一个更复杂的字符串,比如

*abc * def *

我该如何使用grep来实现?

0
0 Comments

在使用grep命令时,有时候我们需要使用星号符号来匹配任意数量的字符。然而,有些系统的grep版本不支持直接使用星号。这就导致了使用星号符号的正则表达式无法正确匹配。

为了解决这个问题,我们可以使用grep命令的-P选项,该选项启用对Perl风格正则表达式的支持。使用-P选项后,我们就可以直接使用星号符号来匹配任意数量的字符。

以下是一个示例,展示了如何使用grep命令的-P选项来匹配一个以"abc"开头,以"def"结尾的字符串:

grep -P "abc.*def" myfile

上述命令将在文件"myfile"中查找所有以"abc"开头,以"def"结尾的字符串。

通过使用grep命令的-P选项,我们可以轻松地使用星号符号来匹配任意数量的字符,从而解决了使用星号符号的正则表达式无法正确匹配的问题。

0
0 Comments

使用星号(*)在grep中的星号的原因是因为星号(*)是一个元字符,它表示匹配零个或多个前面的字符。然而,星号(*)并不是用来匹配任意字符的,而是用来匹配前面字符的零个或多个出现。

为了匹配任意字符,我们应该使用点号(.)。点号(.)是一个元字符,表示匹配除了换行符以外的任意字符。

因此,解决方法是将星号(*)替换为点号(.)。这样可以确保匹配任意字符,而不是前面字符的零个或多个出现。

0
0 Comments

使用星号在grep中的原因是为了实现重复匹配,但需要告诉它重复的是什么。例如,使用.*在两个部分之间进行匹配,grep 'abc.*def' myFile将匹配包含abc后跟def的字符串,两者之间可以有可选的内容。

星号实际上是一个重复操作符,在正则表达式中用来表示重复出现的字符或字符组。如果想匹配任何字符,需要使用.*,其中点号表示任意字符(在一定规则下)。如果只想匹配abc,可以直接使用grep 'abc' myFile

需要注意的是,在正则表达式中,星号是一个修饰符,仅适用于其前面的字符或字符组。如果想让正则表达式中的星号作为通配符使用,需要使用之前提到的.*,其中点号是通配符字符,星号修饰点号表示匹配一个或多个点号,即匹配一个或多个任意字符。

有人可能会混淆shell通配符和正则表达式之间的区别。实际上,星号在控制台中是通配符的一部分,只是作为通配符使用(例如,ls *.log将列出所有以.log结尾的文件)。然而,在正则表达式中,星号是一个修饰符,仅适用于其前面的字符或字符组。如果想让正则表达式中的星号作为通配符使用,需要使用之前提到的.*,其中点号是通配符字符,星号修饰点号表示匹配一个或多个点号,即匹配一个或多个任意字符。

此外,需要注意的是,在grep基本正则表达式中,元字符?+{|()失去了它们的特殊含义。在使用扩展正则表达式时,这会导致未定义行为。

根据POSIX规范,在基本正则表达式(BRE)中,星号在作为BRE的第一个字符或紧跟插入符(^)之后时失去了其特殊含义。在使用扩展正则表达式(ERE)时,这将导致未定义的行为。因此,grep '*foo' file将搜索子字符串"*foo",而grep -E '*foo' file是未定义的行为。

0