使用grep中的星座

Sao*_*obi 73 regex bash grep

我试图在linux/bash中的特定文件中搜索子字符串"abc"

所以我这样做:

grep '*abc*' myFile
Run Code Online (Sandbox Code Playgroud)

它什么都不返回.

但如果我这样做:

grep 'abc' myFile
Run Code Online (Sandbox Code Playgroud)

它正确返回匹配.

现在,这对我来说不是问题.但是,如果我想要更复杂的字符串,那该怎么办?

*abc * def *
Run Code Online (Sandbox Code Playgroud)

我将如何使用grep完成它?

Dan*_*uis 108

星号只是一个重复操作符,但您需要告诉它重复的内容./*abc*/匹配一个包含ab和零个或多个c的字符串(因为第二个*在c上;第一个没有意义,因为它没有重复的内容).如果你想匹配任何东西,你需要说.*- 点意味着任何角色(在某些指导方针内).如果你想只匹配abc,你可以说grep 'abc' myFile.对于更复杂的匹配,您需要使用.*- grep 'abc.*def' myFile将匹配包含abc的字符串,后跟def,其中包含可选的内容.

根据评论更新:

*正则表达式与控制台中的*不完全相同.在控制台中,*是glob构造的一部分,只是充当通配符(例如,ls *.log将列出以.log结尾的所有文件).但是,在正则表达式中,*是一个修饰符,这意味着它只适用于它前面的字符或组.如果你希望正则表达式中的*充当通配符,你需要.*像前面提到的那样使用- 点是通配符,修改点时星号意味着找到一个或多个点; 即.找到一个或多个角色.

  • 我认为提问者对 shell 通配符和正则表达式之间的区别感到困惑。我还怀疑更复杂的表达式是: grep 'abc .* def' (至少存在一个空格 - 可能是我写的两个)。 (3认同)

smc*_*ron 17

点字符表示匹配任何字符,因此.*表示任何字符出现零次或多次.你可能意味着使用.*而不仅仅是*.


小智 13

只有在它前面有某些东西时,"星座"才有意义.如果没有工具(在这种情况下为grep)可能只是将其视为错误.例如:

'*xyz'    is meaningless
'a*xyz'   means zero or more occurrences of 'a' followed by xyz
Run Code Online (Sandbox Code Playgroud)

  • *并非毫无意义; 它只是没有其通常意义(重复),但意味着"我是一个明星".它将匹配包含星号后跟x,y和z的行. (5认同)
  • @Jonathan取决于工具。 (2认同)

Art*_*kii 10

使用 grep -P - 它支持 Perl 风格的正则表达式。

grep -P "abc.*def" myfile
Run Code Online (Sandbox Code Playgroud)


acc*_*ted 9

这对我有用:

grep ".*${expr}" - 带双引号,前面加点。其中 ${expr} 是行末尾所需的任何字符串。

所以在你的情况下:

grep ".*abc.*" myFile
Run Code Online (Sandbox Code Playgroud)

标准 Unix grep。


unw*_*ind 6

您尝试过的表达式,例如在Linux中的shell命令行上运行的表达式,称为" glob ".Glob表达式不是完整的正则表达式,这是grep用于指定要查找的字符串的内容.是(旧的,小的)关于差异的帖子.glob表达式(如"ls*"中)由shell本身解释.

可以从globs转换为RE,但通常需要在头脑中进行转换.