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.txt或grep -F 'ki' trial_file.txt。
除非您将-x/--line-regex选项传递给它,否则grep将返回包含任何地方匹配项的行,即使整行都不是匹配项。所以你所要做的就是匹配该行的一部分。您不必做任何特殊的事情来表明可能有更多字符。
在正则表达式中,*表示“前一项的零个或多个”。这是从它的意义完全不同的壳路径扩展(也参见本文,man 7 glob以及本节)。因此,例如:
ax*b匹配a,然后是任意数量的xes(甚至没有),然后是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。
vir*_*ius 10
我认为你在这里期待 shell 风格的通配符,但你得到的是一个正则表达式。搜索时,ki*您要求的是文字k后跟 0 个或多个is。
第一行也不包含“ki”。
如何正确执行此操作取决于您要匹配的究竟是什么。
如上所述,grep "ki"可能是您想要的,或者如果您只想匹配以“ki”开头的行,则需要grep "^ki".
^表示行的开头。