星号不适用于 grep

Aak*_*edi 4 command-line regex grep text-processing wildcards

我搜索了ki*按下面的例子,它应该已经回到了前三行。我不确定为什么它在没有ki匹配的情况下返回最后一行。

$ grep "ki*" trial_file.txt
kartik,27,Bangalore,Karnataka
pulkit,25,Bangalore,Karnataka
kit,28,Bangalore,Karnataka
kush,24,Pennsylvania,Philadelphia
Run Code Online (Sandbox Code Playgroud)

Eli*_*gan 11

不要*用于此。使用grep 'ki' trial_file.txtgrep -F 'ki' trial_file.txt

  1. 除非您将-x/--line-regex选项传递给它,否则grep将返回包含任何地方匹配项的行,即使整行都不是匹配项。所以你所要做的就是匹配该行的一部分。您不必做任何特殊的事情来表明可能有更多字符。

  2. 在正则表达式中*表示“前一项的零个或多个”。这是从它的意义完全不同的壳路径扩展(也参见本文man 7 glob以及本节)。因此,例如:

    • ax*b匹配a,然后是任意数量的xes(甚至没有),然后是b: ab, axb, axxb, axxxb, ...
    • a[xz]*b匹配a后跟任意数量的字符,其中每个是xz,后跟bab, axb, azb, axxb, axzb, azxb, azzb, axxxb, ...
    • a(xyz)*b匹配a,后跟零次或多次出现的字符串xyz,后跟bab, axyzb, axyzxyzb, axyzxyzxyzb, ...

在这种情况下,您似乎只是在搜索文本。你不需要使用任何正则表达式元字符一样.*或者\有特殊的含义。这就是为什么我建议传递-F标志,这使得grep搜索“固定字符串”而不是执行正则表达式匹配。

但是,如果您只想匹配从行首开始的匹配,那么您确实想使用正则表达式元字符: ^,正如mjb2kmn 建议的那样。这您的比赛锚定到行的开头。在这种情况下,您将运行grep '^ki' trial_file.txt.

有关选项grep支持的更多信息,请参阅man grepGNU Grep 手册

虽然在一般我建议封闭在正则表达式' '的报价在这种情况下没有,引用是必要的,因为shell不执行任何扩展ki^ki将它们传递到前grep


vir*_*ius 10

我认为你在这里期待 shell 风格的通配符,但你得到的是一个正则表达式。搜索时,ki*您要求的是文字k后跟 0 个或多个is。

第一行也不包含“ki”。

如何正确执行此操作取决于您要匹配的究竟是什么。

如上所述,grep "ki"可能是您想要的,或者如果您只想匹配以“ki”开头的行,则需要grep "^ki".
^表示行的开头。

  • 它实际上是默认的基本正则表达式,-E 选项启用“扩展正则表达式”`man grep` 解释了这一点。编辑:抱歉,linux grep 手册页没有很好地解释这一点,但 BSD grep 手册页可以。 (3认同)
  • 当你在没有 `-E` 的情况下使用 `grep` 时,它不是正则表达式,但在这种情况下,它实际上是在寻找具有 0 个或多个 `i`s 的 `k`s (2认同)
  • @Pilot6 Ubuntu 具有 GNU Grep,它支持三种正则表达式方言:为带有 GNU 扩展的 POSIX BRE 传递 `-G` 或无标志,为 POSIX ERE 传递 `-E`,或用于 PCRE(“Perl”)的 `-P`。对于“固定字符串”,它也接受`-F`,其中模式是逐字匹配的。请参阅[*匹配器选择*](http://manpages.ubuntu.com/manpages/xenial/en/man1/grep.1.html)。只有`-F` 不*不*使用正则表达式。与 PCRE 和许多其他方言相比,BRE 和 ERE 彼此更相似;两者都省略了现在常见的强大功能,例如 [环视断言](http://www.regular-expressions.info/lookaround.html)。 (2认同)