我正在尝试在linux / bash中的特定文件中搜索子字符串“ abc”
所以我做:
grep '*abc*' myFile
它什么也不返回。
但是,如果我这样做:
grep 'abc' myFile
它正确返回匹配项。
现在,这对我来说不是问题。但是,如果我想grep输入更复杂的字符串怎么办?
*abc * def *
我将如何使用grep完成它?
我正在尝试在linux / bash中的特定文件中搜索子字符串“ abc”
所以我做:
grep '*abc*' myFile
它什么也不返回。
但是,如果我这样做:
grep 'abc' myFile
它正确返回匹配项。
现在,这对我来说不是问题。但是,如果我想grep输入更复杂的字符串怎么办?
*abc * def *
我将如何使用grep完成它?
*在grep和egrep中含义相同:它是一个量词,表示零个或多个前面的原子。这与Shell使用的通配符完全不同。
Answers:
星号只是一个重复运算符,但是您需要告诉它重复的内容。/*abc*/匹配包含ab和零个或多个c的字符串(因为第二个*在c上;第一个无意义,因为没有重复的内容)。如果您想匹配任何内容,则需要说.*-点表示任何字符(在某些准则内)。如果您只想匹配abc,则可以说grep 'abc' myFile。对于更复杂的匹配,您需要使用.*-grep 'abc.*def' myFile将匹配一个包含abc的字符串,后跟def以及介于两者之间的任意内容。
根据评论更新:
*正则表达式中的字符与控制台中的*不完全相同。在控制台中,*是glob构造的一部分,并且仅充当通配符(例如,ls *.log将列出所有以.log结尾的文件)。但是,在正则表达式中,*是修饰符,表示它仅适用于其前面的字符或组。如果希望*在正则表达式中充当通配符,则需要使用.*前面提到的内容-点是通配符,星号在修改点时表示找到一个或多个点;即。查找任何一个或多个字符。
使用grep -P-启用对Perl样式正则表达式的支持。
grep -P "abc.*def" myfile
您没有使用正则表达式,因此您选择的grep变体应为fgrep,其行为将与您期望的一样。
fgrep现在已弃用,grep -f应改为使用。