我正在尝试在linux / bash
中的特定文件中搜索子字符串“abc”所以我这样做:
grep '*abc*' myFile
它什么都不返回。
但如果我这样做:
grep 'abc' myFile
正确返回匹配。
现在,这对我来说不是问题。但是,如果我想要更复杂的字符串,请说
*abc * def *
如何使用grep完成它?
答案 0 :(得分:101)
星号只是repetition operator,但您需要告诉它重复的内容。 /*abc*/
匹配一个包含ab和零个或多个c的字符串(因为第二个*在c上;第一个没有意义,因为它没有重复的内容)。如果你想匹配任何东西,你需要说.*
- 点表示任何字符(within certain guidelines)。如果你只想匹配abc,你可以说grep 'abc' myFile
。对于更复杂的匹配,您需要使用.*
- grep 'abc.*def' myFile
将匹配包含abc的字符串,后跟def,其中包含可选的内容。
根据评论进行更新:
正则表达式中的 *
与控制台中的*不完全相同。在控制台中,*是glob construct的一部分,只是充当通配符(例如ls *.log
将列出以.log结尾的所有文件)。但是,在正则表达式中,*是一个修饰符,这意味着它只适用于它前面的字符或组。如果您希望正则表达式中的*充当通配符,则需要使用前面提到的.*
- 点是通配符,修改点时星号表示找到一个或多个点;即。找到一个或多个角色。
答案 1 :(得分:14)
点字符表示匹配任何字符,因此.*
表示任何字符出现零次或多次。您可能意味着使用.*
而不仅仅是*
。
答案 2 :(得分:11)
“星座”只有在它前面有东西时才有意义。如果没有工具(在这种情况下为grep)可能只是将其视为错误。例如:
'*xyz' is meaningless
'a*xyz' means zero or more occurrences of 'a' followed by xyz
答案 3 :(得分:5)
您尝试过的表达式,例如在Linux中的shell命令行上运行的表达式,称为“glob”。 Glob表达式未满regular expressions,这是grep用于指定要查找的字符串的内容。 Here(旧的,小的)关于差异的帖子。 glob表达式(如“ls *”中)由shell本身解释。
可以从全球转换为RE,但您通常需要在脑海中进行转换。
答案 4 :(得分:4)
你没有使用正则表达式,所以你选择的grep变体应该是fgrep
,它的行为与你期望的一样。
答案 5 :(得分:3)
答案 6 :(得分:3)
使用grep -P - 支持Perl样式的正则表达式。
grep -P "abc.*def" myfile
答案 7 :(得分:1)
这可能是您正在寻找的答案:
grep abc MyFile | grep def
唯一的事情是......它的输出线是" def"在" abc"
之前或之后答案 8 :(得分:0)
'*'用作前一项的修饰符。因此'abc * def'搜索'ab',然后搜索0或更多'c',然后搜索'def'。
你可能想要的是'abc。* def',它搜索'abc'后跟任意数量的字符,后跟'def'。
答案 9 :(得分:0)
这对我有用:
grep“。* $ {expr}”-用双引号引起来,在点号之前是标准grep,没有附加开关。