我按照下面的示例搜索了ki
with *
,它应该返回前三行。我不确定为什么在没有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.txt
或grep -F 'ki' trial_file.txt
。
除非你传递
-x
/--line-regex
选项,grep
将返回以下行包含任何位置都匹配,即使整行不匹配。所以您要做的就是匹配部分行。您不必做任何特殊的事情来表明可能还有更多字符。在正则表达式中,
*
表示“零个或多个前一个项”。这与shell 路径名扩展(也可以看看本文,man 7 glob
, 和本节)例如:ax*b
匹配a
,后跟任意数量的x
es (甚至没有),后跟b
:ab
,axb
,axxb
,axxxb
,...a[xz]*b
匹配a
后跟任意数量的字符,其中每个字符是x
或,z
后跟b
:ab
,,,,,,,,,...axb
azb
axxb
axzb
azxb
azzb
axxxb
a(xyz)*b
匹配,后跟零次或a
多次出现的字符串xyz
,后跟b
:ab
,,,,,...axyzb
axyzxyzb
axyzxyzxyzb
在这种情况下,您似乎只是在搜索文本。您不需要使用任何正则表达式元字符比如.
、*
或\
等具有特殊含义的字符。这就是为什么我建议传递标志-F
,这使得grep
搜索“固定字符串”而不是执行正则表达式匹配。
但是,如果你只想从开始行,那么您确实需要使用正则表达式元字符:^
,如mjb2kmn 建议。 这锚点将您的匹配项移至行首。在这种情况下,您将运行grep '^ki' trial_file.txt
。
有关选项grep
支持的更多信息,请参阅man grep
和GNU Grep 手册。
虽然一般来说我建议将正则表达式括在'
'
引号,在这种情况下没有引用是必要的,因为 shell 不执行任何扩展在将它们传递给ki
之前。^ki
grep
答案2
我认为您在这里期待的是 shell 样式的通配符,但您得到的是正则表达式。搜索时,ki*
您要求的是文字,k
后跟 0 个或更多个i
s。
第一行也不包含“ki”。
如何正确地做到这一点取决于您到底想匹配什么。
正如上面所评论的,这grep "ki"
可能是您想要的,或者如果您只想匹配以“ki”开头的行,您需要grep "^ki"
.
^
表示行的开头。