Asterisk 无法与 grep 一起使用

Asterisk 无法与 grep 一起使用

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

$ grep "ki*" trial_file.txt
kartik,27,Bangalore,Karnataka
pulkit,25,Bangalore,Karnataka
kit,28,Bangalore,Karnataka
kush,24,Pennsylvania,Philadelphia

答案1

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

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

  2. 在正则表达式中*表示“零个或多个前一个项”。这与shell 路径名扩展(也可以看看本文man 7 glob, 和本节)例如:

    • ax*b匹配a,后跟任意数量的xes (甚至没有),后跟b: abaxbaxxbaxxxb,...
    • a[xz]*b匹配a后跟任意数量的字符,其中每个字符是x或,z后跟bab,,,,,,,,,...axbazbaxxbaxzbazxbazzbaxxxb
    • a(xyz)*b匹配,后跟零次或a多次出现的字符串xyz,后跟bab,,,,,...axyzbaxyzxyzbaxyzxyzxyzb

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

但是,如果你只想从开始行,那么您确实需要使用正则表达式元字符:^,如mjb2kmn 建议。 这锚点将您的匹配项移至行首。在这种情况下,您将运行grep '^ki' trial_file.txt

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

虽然一般来说我建议将正则表达式括在' '引号,在这种情况下没有引用是必要的,因为 shell 不执行任何扩展在将它们传递给ki之前。^kigrep

答案2

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

第一行也不包含“ki”。

如何正确地做到这一点取决于您到底想匹配什么。

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

相关内容